• 案例分析:设计模式与代码的结构特性


    一、单例设计模式

      单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。

      单例模式有 3 个特点:

    • 单例类只有一个实例对象;
    • 该单例对象必须由单例类自行创建;
    • 单例类对外提供一个访问该单例的全局访问点;

      单例模式的应用场景:

    • 在应用场景中,某类只要求生成一个对象的时候,如一个班中的班长、每个人的身份证号等。
    • 当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如 Web 中的配置对象、数据库的连接池等。
    • 当某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池、网络连接池等。

    二、单例模式的结构

      通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。其结构如下图:

     

    三、单例模式的应用实例

      问题:用懒汉式单例模式模拟产生美国当今总统对象。

      分析:在每一届任期内,美国的总统只有一人,所以本实例适合用单例模式实现,下图所示是用懒汉式单例实现的结构图。

     

      类代码如下:

     1 public class SingletonLazy
     2 {
     3     public static void main(String[] args)
     4     {
     5         President zt1=President.getInstance();
     6         zt1.getName();    //输出总统的名字
     7         President zt2=President.getInstance();
     8         zt2.getName();    //输出总统的名字
     9         if(zt1==zt2)
    10         {
    11            System.out.println("他们是同一人!");
    12         }
    13         else
    14         {
    15            System.out.println("他们不是同一人!");
    16         }
    17     }
    18 }
    19 class President
    20 {
    21     private static volatile President instance=null;    //保证instance在所有线程中同步
    22     //private避免类在外部被实例化
    23     private President()
    24     {
    25         System.out.println("产生一个总统!");
    26     }
    27     public static synchronized President getInstance()
    28     {
    29         //在getInstance方法上加同步
    30         if(instance==null)
    31         {
    32                instance=new President();
    33         }
    34         else
    35         {
    36            System.out.println("已经有一个总统,不能产生新总统!");
    37         }
    38         return instance;
    39     }
    40     public void getName()
    41     {
    42         System.out.println("我是美国总统:特朗普。");
    43     }  
    44 }

      在这个例子中,President类中定义了一个静态President对象,保证该对象属性的全局唯一性,主程序中实例化了zt1和zt2对象,但两个对象内存区只存在一份President的拷贝,实现了单例模式的设计方法。

  • 相关阅读:
    Dreamweaver采用utf8制作页面,到.net显示乱码问题解决
    看不完的风景,走不完的路
    整个世界都在返利
    Google 地图小工具:让别人找到你
    开心网
    提取国家地理图片总结
    [脚本收集]:在线词典
    提取国家地理图片总结之二
    [脚本收集]提取国家地理图片
    若我离去,后会无期
  • 原文地址:https://www.cnblogs.com/wzzgeorge/p/12005027.html
Copyright © 2020-2023  润新知