前言
单例模式(Sigleton Parttern)是23种设计模式中最简单也是最常见的一种设计模式,单例模式确保了一个类只有一个实例,由于内存中只有一个实例,因而减少了内存的开支,并且使用单例模式也可以减少对资源的多重占用等。
单例模式经常出现在面试题中,题型也比较,有时是选择题,有时会让手写单例模式实现代码,所以还是有必要牢牢掌握这个设计模式。
定义
单例模式的定义如下:
Ensure a class has only one instance,and provide a global point of access to it.(确保一个类只有一个实例,而且自行实例化并像整个系统提供这个实例。)
单例模式的通用类图如图1-1所示。
图1-1:单例模式通用类图
Singleton类称为单例类,通过构造方法私有化并自行实例化确保只有一个实例,单例模式的通用源代码如代码清单1-1所示 。
代码清单1-1 单例模式通用代码
public class Singleton {
private static Singleton singleton = new Singleton();
//限制产生多个实例
private Singleton(){
}
//通过该方法获取实例对象
private static Singleton getSingleton(){
return singleton;
}
}
单例模式有两种
单例模式有两种实现方式,分别为饿汉式单例和懒汉式单例,代码清单1-1所示为饿汉式单例,而懒汉式单例如代码清单1-2所示。
代码清单1-2 懒汉式单例代码
public class Singleton {
private static Singleton singleton;
//限制产生多个实例
private Singleton(){
}
//通过该方法获取实例对象
private static Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
单例模式的使用场景
在一个系统中,要求一个类有且仅有一个对象,如果出现多个对象就会出现“不良反应”,可以采用单例模式,具体场景如下:
除此之外,单例模式还有很多的应用场景,在此就一一列举了。
单例模式的注意事项
在高并发情况下,需要注意单例模式的线程同步问题,单例模式通常有两种实现方式,懒汉式单例是线程不安全的,一般建议采用懒汉式单例。
最佳实践
单例模式的应用非常广泛,如在Spring中,每个Bean默认就是单例的,这样做的优点是Spring容器可以管理这些Bean的生命周期,决定什么时候创建出来(默认项目启动的时候创建),什么时候销毁,销毁的时候要如何处理,等等。如果采用非单例模式(Prototype类型),则Bean初始化后的管理交由J2EE容器,Spring容器不再跟踪管理Bean的生命周期。
参考自 :《设计模式之禅》——秦小波