1.单例的优势
单例模式(Singleton Pattern)是 Java 中创建型模式中最简单的设计模式,它提供了一种创建对象和访问对象以及减少资源重复创建的极佳的方式。
这种模式涉及到一个单一的类或者单一的内部类,该类负责创建同时确保只有该类的唯一对象被创建。这个类提供了以类名访问该对象的访问方式。
既然单例模式这么多优点那么我们怎么设计单例模式呢。
1.我们需要知道对象的创建有哪几种方式:
new一个对象,反射newinstance(), 反序列化ObjectInputStream()
2.我们需要怎样避免重复创建对象。
1.防止多线程不同线程重复创建对象
2.反射方式创建对象
3.序列化创建对象
3.我们需要创建一个具备满足上述功能的类
1.提供类访问对象的方法
2.类的构造器需要隐藏起来
3.多线程安全控制
4.对于序列化和反射的屏蔽处理
2.单例的类型
1.饿汉模式
2.懒汉模式
3.双重检测模式
4.内部类类加载模式
5.集合模式
6.枚举类型模式
3.单例防反射
1.内部类单例防止反射
public class TestReflection {
public static volatile TestReflection testReflection = null;
private TestReflection(){
if(testReflection != null){
throw new RuntimeException("反射");
}
}
public static TestReflection getInstance(){
return testReflection = InnerClass.testReflection;
}
private static class InnerClass{
public static TestReflection testReflection = new TestReflection();
}
}
使用测试
try {
Class clazz = Class.forName("com.dawn.appbase.utils.TestReflection");
Constructor constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true);
TestReflection newInstance = (TestReflection) constructor.newInstance();
Log.d("TestReflection", "TestReflection "+newInstance);
catch (Exception e) {
Log.d("TestReflection", "Exception "+e.getMessage());
e.printStackTrace();
}
//报错
2021-03-26 21:08:55.715 4397-4397/com.dawn.appbase D/TestReflection: Exception null
2021-03-26 21:08:55.716 4397-4397/com.dawn.appbase W/System.err: at com.dawn.appbase.utils.TestReflection.<init>(TestReflection.java:8)
2.枚举类型防止反射
package com.dawn.appbase.utils;
public enum TestReflection {
Instance;
public TestReflection getInstance(){
return Instance;
}
}
//测试
try {
Class clazz = Class.forName("com.dawn.appbase.utils.TestReflection");
Constructor constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true);
TestReflection newInstance = (TestReflection) constructor.newInstance();
Log.d("TestReflection", "TestReflection "+newInstance);
} catch (Exception e) {
Log.d("TestReflection", "Exception "+e.getMessage());
e.printStackTrace();
}
//报错
2021-03-26 21:49:06.293 15728-15728/com.dawn.appbase D/TestReflection: Exception com.dawn.appbase.utils.TestReflection.<init> []
2021-03-26 21:49:06.295 15728-15728/com.dawn.appbase W/System.err: java.lang.NoSuchMethodException: com.dawn.appbase.utils.TestReflection.<init> []