美文网首页程序员每天写500字
重学设计模式(三):《Head First设计模式》单件模式篇

重学设计模式(三):《Head First设计模式》单件模式篇

作者: LY丶Smile | 来源:发表于2019-01-04 20:55 被阅读23次

基础梳理

单件模式(平常习惯叫单例)是一个比较简单的设计模式,也是最为常见的一个模式。

  • 定义:确保一个类只有一个实例,并提供一个全局访问点
  • 构成:私有的构造器一个静态方法一个静态变量
  • 确保程序中使用的全局资源只有一份
  • 必须是“请求”得到一个实例,而不能自行实例化

应用场景

单例模式一般用于资源共享,有点类似全局变量

场景实例

  • 数据库连接池,整个JVM只需要创建一个连接池即可,所有人都只需要从这个连接池getConnection即可,而不需要每个人都去createConnection,避免了因频繁创建、注销而产生的损耗(网络损耗、性能损耗等)
  • 线程池。
  • 计数器。

注意事项

  • 与全局变量区别:全局变量可以提供全局访问,但是不能确保只有一个实例
  • 一个系统用到单例的地方还是比较少的,如果用了大量的单例就需要检查设计是否合理了。同理,任何设计模式都不该被滥用。
  • 如果有多个类加载器
    • 每个类加载器都定义了一个命名空间
    • 不同的类加载器可能会加载同一个类
    • 可能会导致多个单件并存的怪异现象

代码实例

最简单的实现(非线程安全)

public class Singleton1 {

       // 构造方法为private,不允许被外部实例化
       private Singleton1() { }
       // 静态变量
       private static Singleton1 single = null;
       // 静态方法
       public static Singleton1 getInstance() {
          // 如果是第一次,需要先实例化
          if (single == null) {
             single = new Singleton1();
          }
          return single;
       }
}

最简单的线程安全版本

public class Singleton2 {

       // 构造方法为private,不允许被外部实例化
       private Singleton2() { }
      // 类创建的时候就将对象实例化出来,以后不再改变
       private static final Singleton2 single = new Singleton2();

       public static Singleton2 getInstance() {
              return single;
       }
}

这两个实现是学习单例模式的最简单实现,把握住三个点就好了:

  • 构造方法私有:不允许被外界实例化,外界只能请求得到实例
  • 静态方法:提供实例
  • 静态变量:实例,全局唯一

写在最后

学习笔记,如有错误请指正,谢谢~

相关文章

网友评论

    本文标题:重学设计模式(三):《Head First设计模式》单件模式篇

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