美文网首页
<<设计模式之禅(第二版)>>——第七章

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

作者: leiiiooo | 来源:发表于2016-10-11 09:48 被阅读9次
    定义:
    • 确保某一个类只有一个实例,而且自行实例化并向整个体系提供实例。
    优点:
    • 减少内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化。
    • 减少了性能开销,当一份对象的产生需要较多资源的时,如读取配置、产生其他以来对象,则可以通过在应用启动时创建一个单例对象,然后永驻内存(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<String> nameVector = new Vector();
      
      private static Vector<FixedCountObject> 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);
          }
      }

    相关文章

      网友评论

          本文标题:<<设计模式之禅(第二版)>>——第七章

          本文链接:https://www.haomeiwen.com/subject/pwrvyttx.html