单例设计模式
概念:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
例如:Windows中只能打开一个任务管理器。这样可以避免因打开多个任务管理器窗口二造成内存资源的浪费,或出现各个窗口内容的不一致等错误。
应用场景:Windows的回收站,系统缓存
单例模式三个特点:
-
单例类只有一个实例对象;
-
该单例对象必须由单例类自行创建;
-
单例类对外提供一个访问该单例的全局访问点;
应用场景:
-
需要频繁创建的一些类,使用单例可以降低系统的内存压力,减少GC。
-
某些类只有求生成一个对象的时候,如每个学生的学号
-
某些类创建实例时占用资源较多,或实例化耗时比较长,且经常使用
-
某些类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池,网络连接池
-
频繁访问数据库或者文件的对象
-
当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如Web中的配置对象,数据库的链接池等。
结构与实现
-
单例模式的结构
单例类:包含一个实例且能自行创建这个实例的类。
访问类:使用单例的类。
-
单例模式的实现
-
懒汉模式
该模式的特点是类加载时没有生成单例,只有当第一次调用 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;
}
}
博观而约取,厚积而薄发

浙公网安备 33010602011771号