单例设计模式

概念:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。

例如:Windows中只能打开一个任务管理器。这样可以避免因打开多个任务管理器窗口二造成内存资源的浪费,或出现各个窗口内容的不一致等错误。

应用场景:Windows的回收站,系统缓存

单例模式三个特点:

  1. 单例类只有一个实例对象;

  2. 该单例对象必须由单例类自行创建;

  3. 单例类对外提供一个访问该单例的全局访问点;

应用场景:

  • 需要频繁创建的一些类,使用单例可以降低系统的内存压力,减少GC。

  • 某些类只有求生成一个对象的时候,如每个学生的学号

  • 某些类创建实例时占用资源较多,或实例化耗时比较长,且经常使用

  • 某些类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池,网络连接池

  • 频繁访问数据库或者文件的对象

  • 当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如Web中的配置对象,数据库的链接池等。

结构与实现

  1. 单例模式的结构

    单例类:包含一个实例且能自行创建这个实例的类。

    访问类:使用单例的类。

  1. 单例模式的实现

    • 懒汉模式

      该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例。

      优点:第一次调用才初始化,避免内存浪费。 缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。getInstance() 的性能对应用程序不是很关键(该方法使用不太频繁)。

    public class LazySingleton {
       private static volatile LazySingleton instance = null;   //volatile 保证 instance 在所有线程中同步

       private LazySingleton() {
      }    //构造方法前用 private 避免类在外部被实例化

       public static synchronized LazySingleton getInstance(){      
           //synchronized getInstance 方法前加同步
           if (instance == null) {
               instance = new LazySingleton();
          }
           return instance;
      }
  }
  • 饿汉式单例

    该模式的特点是类一旦加载就创建一个单例,保证在调用getlnstance 方法之前单例已经存在了

public class HungrySingleton {
   private static final HungrySingleton instance = new HungrySingleton();
    // static final 修饰创建实例
   private HungrySingleton() {
  }

   public static HungrySingleton getInstance() {
       return instance;
  }
}

 

 

posted @ 2021-03-14 23:31  扣扣M  阅读(54)  评论(0)    收藏  举报