<<设计模式之禅(第二版)>>——第七章 单例模式

定义:
  • 确保某一个类只有一个实例,而且自行实例化并向整个体系提供实例。
优点:
  • 减少内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化。
  • 减少了性能开销,当一份对象的产生需要较多资源的时,如读取配置、产生其他以来对象,则可以通过在应用启动时创建一个单例对象,然后永驻内存(jave EE中注意jvm垃圾回收机制)
  • 设置全局的访问点,优化共享资源,可以设计一个单例类,负责所有的数据表的映射处理
缺点:
  • 单例模式通常没有接口,拓展很难。单例模式是要求自行实例化,而接口和抽象类不可能被实例化。
  • 对测试不利,在并行开发的环境下,如果单例没有完成,是不能进行测试的,没有接口也不能使用mock的方式虚拟对象。
  • 单例模式与单一职责原则有冲突,一个类应该只实现一个逻辑,而不应该关心是否是单例,单例取决于环境,单例模式把“要单例”和业务逻辑融合在一个类中。
注意事项:
  • 单例模式的线程同步问题:
    //饿汉式
    public class SingleDemo {
    // 私有化构造函数
    private SingleDemo() {
    }
    // 提供已经初始化完毕的对象
    private static final SingleDemo sd = new SingleDemo();
    // 提供静态的获取方法
    public static SingleDemo getInstance() {

      return sd;
      }
    }
    
单例模式的拓展:
  • 产生固定数量对象(线程安全)
    //产生指定数量的对象
    public class FixedCountObject {
    private static int countOfMax = 5;// 创建对象的总数量

    private static int currentNum = 0;
    
    private static Vector nameVector = new Vector();
    
    private static Vector objectVector = new Vector();
    
    static {// 初始化
      for (int i = 0; i < countOfMax; i++) {
          objectVector.add(new FixedCountObject("object->" + i));
      }
    }
    
    private FixedCountObject() {
    };
    
    private FixedCountObject(String name) {
      nameVector.add(name);
    };
    
    // 随机获取对象
    public static FixedCountObject getInstance() {
      Random random = new Random();
      currentNum = random.nextInt(countOfMax);
    
      return objectVector.get(currentNum);
        }
    }

你可能感兴趣的:(<<设计模式之禅(第二版)>>——第七章 单例模式)