文章目录
为什么要用单例模式
- 为什么要用单例模式
- 常见的单例模式的写法
- 反射破解单例模式
需要同一个容器, 将所有的目标对象管理起来, 容器需要用单例来实现, 因此就要用到单例模式.
常见的单例模式的写法常见的单例模式, 一般分为懒汉式和饿汉式. 饿汉式的写法 https://javaweixin6.blog.csdn.net/article/details/108435222
懒汉式的写法 https://javaweixin6.blog.csdn.net/article/details/108435929
反射破解单例模式在上面提到的懒汉式和饿汉式中, 都可以通过反射来破解单例模式 例子如下 懒汉式的单例模式写法
public class Singleton {
private volatile static Singleton singleton ;
private Singleton() {
}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
return new Singleton();
}
}
}
return singleton;
}
}
写一个单元测试类如下
@Test
public void getInstanceTest() throws Exception {
// 通过调用静态方法创建对象
Singleton instance = Singleton.getInstance();
System.out.println(instance);
// 通过反射创建对象
Class singletonClass = Singleton.class;
Constructor constructor = singletonClass.getDeclaredConstructor();
constructor.setAccessible(true);
Singleton singleton = constructor.newInstance();
System.out.println(singleton);
}
打印如下 , 打印出了两个对象 , 代表反射可以破解其单例模式