单例设计模式
1.单例设计模式核心:构造方法私有化。单例模式保证一个类只有一个实例,并且提供一个访问它的全局访问的。
2.单例设计模式分为:直接实例化(饿汉式);延迟实例化(懒汉式)
直接实例化(饿汉式)
//构造方法私有化
private Person() {
}
//提供一个全局的访问点 饿汉式(直接实例化)
private static final Person p = new Person();
public static Person getInstance(){
return p;
}
延时实例化(懒汉式)
//构造方法私有化
private Person2() {
}
//提供一个全局的访问点 懒汉式(延迟实例化)
private static Person2 person2 = null;
public static Person2 getInstance() {
if (person2 == null) {
person2 = new Person2();
}
return person2;
}
3.在单例模式中 延迟实例化单例是线程不安全的 解决线程不安全方法有三种:
1.加全局同步2.加局部同步3.静态内部类
//此线程是不安全的 解决方式一 加完全同步方法
public static synchronized SolutionSingle getInstance(){
if (s==null){
s = new SolutionSingle();
}
return s;
}
//解决方法二 加局部同步
public static SolutionSingle getInstance(){
if (s==null){
synchronized (SolutionSingle.class){
if (s==null){
s = new SolutionSingle();
}
}
}
return s;
}
//解决方法三 静态内部类
private static class my{
private static final SolutionSingle s= new SolutionSingle();
}
public static final SolutionSingle getInstance(){
return my.s;
}
4.通过反射和序列化反序列化可以破解单例模式
//通过反射可以破解单例模式
Class<?> aClass = Class.forName("cn.itcast.SinglePattern.domain.Person");
Constructor<?> constructor = aClass.getDeclaredConstructor();
constructor.setAccessible(true);
Object o = constructor.newInstance();
Object o1 = constructor.newInstance();
System.out.println(o);
System.out.println(o1);
5.防止反射破解单例模式方法
//构造方法私有化
private Person() {
//防止反射破解单例模式
if(p!=null){
throw new RuntimeException("对象不为空 无法创建");
}
}