版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29994609/article/details/51894277
意图:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
个人理解:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
- 单例模式最常使用的场景是对系统资源的控制。
适用性:
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
- 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
单例模式的3种实现方式
懒汉式单例类
public class LazySingleton {
private static LazySingleton singleton=null;
//私有的默认构造方法,此类不能被继承
private LazySingleton(){}
//同步,静态工厂方法,返回此类的唯一实例
public synchronized static LazySingleton getInstance(){
if(singleton==null){
singleton=new LazySingleton();
}
return singleton;
}
}
优点:第一次调用才初始化,避免内存浪费。
缺点:线程不安全,必须加锁synchronized 才能保证单例,但加锁会影响效率。
饿汉式单例
public class EagerSingleton {
//私有的类成员常量
private static final EagerSingleton SINGLETON=new EagerSingleton();
//私有的默认构造方法,此类不能被继承
private EagerSingleton(){}
//静态工厂方法
public static EagerSingleton getInstance(){
return SINGLETON;
}
}
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。
登记式单例类(登记式单例类是为了克服饿汉式单例类和懒汉式单例类不可继承的缺点而设计的)
http://blog.csdn.net/lanzhizhuxia/article/details/7922977
扫描二维码关注公众号,回复:
3216878 查看本文章