故事中的设计模式-单例

单例设计模式
单例:顾名思义,某个类只能产生一个实例。
要点:1.构造方法私有化
2.必须自行创建这个类的实例
3.必须自行向系统中提供这个类的实例

1) 饿汉式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Singleton{
private static final Singleton instance = new Singleton();

private Singleton(){
//解决反射机制导致多个实例的问题
if(null != instance){
throw new RuntimeException("已存在该实例");
}
}

public static Singleton getInstance(){
return instance;
}
}

总结:类加载时初始化实例对象,解决了线程安全问题,但是不能实现延迟加载的问题

2) 懒汉式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Singleton{
private static final Singleton instance = null;

private Singleton(){
//解决反射机制导致多个实例的问题
if(null != instance){
throw new RuntimeException("已存在该实例");
}
}

public static synchronized Singleton getInstance(){
if(null == instance){
instance = new Singleton();
}
return instance;
}
}

总结:能够实现延迟加载,也能解决线程安全问题,因为使用了同步所以效率非常低,不建议使用

3) 内部静态类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Singleton{
private static final Singleton instance = null;

private Singleton(){
//解决反射机制导致多个实例的问题
if(null != instance){
throw new RuntimeException("已存在该实例");
}
}

public static class InnerClass{
private static final Singleton innerInstance = new Singleton();
}

public static Singleton getInstance(){
instance = InnerClass.innerInstance;
return instance;
}
}

总结:可以实现延迟加载,能够解决线程安全问题,建议使用

4) 枚举

1
2
3
public enum Singleton{
INSTANCE;
}

总结:天然的线程安全,但是不能实现延迟加载。使用较少,但是可以使用

坚持原创技术分享,您的支持将鼓励我的继续创作