单例模式保证一个类只有一个实例,并提供一个访问它的全局访问点。
为了保证一个类只有一个实例,那么就要防止类的构造函数中会在被外部调用的时候构造出新的实例。所以就要将构造函数的访问权限标记为private或者protected,然后提供全局访问点,返回类内部唯一构造的实例。
class Singleton{
//声明单例对象是静态的
private static Singleton single = null;
//构造函数是私有的
private Singleton(){};
//通过静态方法来构造对象
public static Singleton getInstance(){
//判断单例对象是否已经被构造
if(single == null){
single = new Singleton();
}
return single;
}
}
上面的单例模式实现无法保证在多线程的情况下正常执行,所以需要加上同步标志。
class Singleton{
//声明单例对象是静态的
private static Singleton single = null;
private static Object obj = new Object();
//构造函数是私有的
private Singleton(){};
//通过静态方法来构造对象
public static Singleton getInstance(){
//提高效率
if(single == null){
//加线程锁
lock(obj){
//判断单例对象是否已经被构造
if(single == null){
single = new Singleton();
}
}
}
return single;
}
}
单例是为了保证系统中只有一个实例,其关键点有:
- 私有构造函数
- 声明静态单例对象
- 构造单例对象之前要加锁(lock一个静态的object对象)
- 需要两次检测单例实例是否已经被构造,分别在锁之前和锁之后