单例模式保证一个类只有一个实例,并提供一个访问它的全局访问点。
为了保证一个类只有一个实例,那么就要防止类的构造函数中会在被外部调用的时候构造出新的实例。所以就要将构造函数的访问权限标记为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对象)
- 需要两次检测单例实例是否已经被构造,分别在锁之前和锁之后
推荐阅读
- 面试|我经历的IT公司面试及离职感受(转)
- java|设计模式——创建型——工厂方法(Factory Method)
- 设计模式|设计模式_创建型模式——工厂方法
- 设计模式|设计模式——创建型软件设计模式——工厂方法模式
- 设计模式之装饰器模式
- 设计模式之设计原则
- 设计模式六大原则(5)(迪米特法则 最少知道)
- 观察者模式实现之EventBus(Google)
- Java高级面试|常见设计模式——装饰模式
- java设计模式——单例模式