大家好,我是三乙己。考上大家一考:"单例模式的单例,怎样写的?"
"不就是构造方法私有化么?"
”对呀对呀!……单例模式有七种写法,你知道么?“
言归正传……
单例模式(Singleton Pattern)可以说是最简单的设计模式了。
用一个成语来形容单例模式——“天无二日,国无二主”。
什么意思呢?就是当前进程确保一个类全局只有一个实例。
那单例模式有什么好处呢?[1]
- 单例模式在内存中只有一个实例,减少了内存开支
- 单例模式只生成一个实例,所以减少了系统的性能开销
- 单例模式可以避免对资源的多重占用
- 单例模式可以在系统设置全局的访问点
那单例模式是银弹吗?它有没有什么缺点?
- 单例模式一般没有接口,扩展很困难
- 单例模式不利于测试
- 单例模式与单一职责原则有冲突
那什么情况下要用单例模式呢?
- 要求生成唯一序列号的环境
- 在整个项目中需要一个共享访问点或共享数据
- 创建一个对象需要消耗的资源过多
- 需要定义大量的静态常量和静态方法(如工具类)的环境
接下来,进入今天的主题,我们来看看单例模式的七种写法!
1、饿汉式(线程安全)⭐
public class Singleton_1 {
private static Singleton_1 instance=new Singleton_1();
private Singleton_1() {
}
public static Singleton_1 getInstance() {
return instance;
}
}
饿汉式
,就像它的名字,饥不择食,定义的时候直接初始化。
因为instance
是个静态变量,所以它会在类加载的时候完成实例化,不存在线程安全的问题。
这种方式不是懒加载,不管我们的程序会不会用到,它都会在程序启动之初进行初始化。
所以我们就有了下一种方式