GOF23设计模式(二)

GOF设计模式之单例模式(二)

静态内部类式和枚举式

单例模式之静态内部类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 单例模式:静态内部类
* 线程安全,效率高,并发高效和延迟加载
*/
public class Singleton3 {
private static class SingletonInstance{
private static final Singleton3 instance=new Singleton3();
}
public Singleton3 getinstance() {
return SingletonInstance.instance;
}
private Singleton3() {
}
public static void main(String[] args) {
System.out.println(new Singleton3().getinstance());
}
}

单例模式之枚举式

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 单例模式:枚举实现
* 效率高,没有延迟加载
*/
//1.避免了反射和反序列化的漏洞。2.
public enum Singleton4 {
//枚举元素本身就是单例对象
INSTANCE;
//添加自己需要的代码
public void SingletonOperation() {
}
}

单例模式总结

主要:

– 饿汉式(线程安全,调用效率高,不能延时加载)
– 懒汉式(线程安全,调用效率不高,能延时加载)

其它:

– 双重检查锁式(由于JVM底层内部模型原因,偶尔会出问题,不推荐使用)
– 静态内部类式(线程安全,调用效率高,可以延时加载)
– 枚举式(线程安全,调用效率高,不能延时加载)

如何选用

单例对象占用资源少,不需要延时加载:

– 枚举式好于饿汉式

单例对象占用资源大,需要延时加载:

– 静态内部类式好于懒汉式

以上除了(枚举式)不能被反射和反序列化破解以外,其它都能破解

如何防止反射的破解(简单了解)

1
2
3
4
5
6
7
//在私有构造器上加上检查,不为空的时候手动抛出异常
private Singleton2() {
if(instance!=null)
{
throw new RuntimeException();
}
}

如何防止反序列化破解(简单了解)

1
2
3
4
5
//在反序列化时调用此方法直接返回instance,不需要在单独创建对象。
private Object readResolve()throws ObjectStreamException {
return instance;

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