设计模式之单例模式(Singleton Pattern)

小咪咪 2022-05-12 14:26 328阅读 0赞
  • 单例模式的定义
    Ensure a class has only one instance, and provide a global point of access to it。确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个唯一实例。
  • 单例模式的通用类图
    在这里插入图片描述
  • 单例模式通用代码

    /**

    • 单例模式通用代码
    • @author cm_wang
      /
      public class SingletonPattern {

      private static final SingletonPattern singletonPattern = new SingletonPattern();

      // 私有的构造方法,为了限制产生多个对象
      private SingletonPattern() {
      }

      /**

      • 通过这个方法获得对象唯一实例
      • @return
        */
        public static SingletonPattern getSingleton() {
        return singletonPattern;
        }
        }
  • 正如上面的代码所述一样,单例模式有两个要素要记得

    • 私有的构造方法。为了防止系统中出现多个实例,保证该实例的唯一性。
    • 以自己实例为返回值的静态的公有的方法。外部会通过这个方法来获取该对象的唯一实例。
  • 单例模式会根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例。饿汉式单例和懒汉式单例的区别是:饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用;而懒汉式单例在调用取得实例方法的时候才会实例化对象
  • 饿汉式单例代码,正如单例模式通用代码一样,这里略。
  • 懒汉式单例代码

    /**

    • 懒汉式单例
    • @author cm_wang
      /
      public class SingletonPattern {

      private static SingletonPattern singletonPattern;

      private SingletonPattern(){}

      public static synchronized SingletonPattern getInstance(){

      1. if(singletonPattern==null){
      2. singletonPattern = new SingletonPattern();
      3. }
      4. return singletonPattern;

      }
      }

细心的小伙伴已经发现getInstance()加了synchronized关键字。是因为在多线程的环境下,单例模式会出现线程不安全的问题,这个时候就需要考虑线程同步。假设线程A执行到singletonPattern = new SingletonPattern();,但是此时没有获取到对象(毕竟对象的实例化是需要实现的),这个时候线程B也在执行,执行到if(singletonPattern==null),线程B就会判断为true,继续运行下去,这样子就会导致线程A和线程B一下自创建了两个对象,就违背了单例模式的思想,内存中就会存在两个实例。

  • 双重校验版单例

    /**

    • 双重校验版单例代码
    • @author cm_wang
      /
      public class SingletonPattern {
      private static SingletonPattern singletonPattern;

      private SingletonPattern() {}

      public static SingletonPattern getInstance() {

      1. if(singletonPattern == null) {
      2. synchronized(SingletonPattern.class) {
      3. if(singletonPattern == null) {
      4. singletonPattern = new SingletonPattern();
      5. }
      6. }
      7. }
      8. return singletonPattern;

      }
      }

  • 单例模式的好处

    • 因为单例模式会保证内存中只有一个对象,减少内存的开销。
    • 单例模式无论是饿汉式还是懒汉式,都可以避免频繁的创建和销毁对象,可以提高程序的性能。
    • 单例模式是支持全局访问的。
    • 避免对程序的公共资源的占用和浪费。
  • 枚举实现单例模式
  • 拓展

参考书籍:设计模式之禅Head First设计模式
实例代码放在这里。

发表评论

表情:
评论列表 (有 0 条评论,328人围观)

还没有评论,来说两句吧...

相关阅读