其他分享
首页 > 其他分享> > 单例模式设计模式

单例模式设计模式

作者:互联网

单例模式

单例模式必须具有三点

常见的五种实现模式

主要
其他
饿汉式
public class SingletonDemo{
/*提供一个私有的静态变量*/
	private static  SingletonDemo singletonDemo=new SingletonDemo()
 /*构造器私有化*/
	private SingletonDemo(){} 
/*提供一个开放的方法 */
	public static /*synchronized*/  SingletonDemo  getInstance(){
			return  singletonDemo; }
}
懒汉式
public class SingletonDemo{

	private static  SingletonDemo singletonDemo

	private SingletonDemo(){} 

	public static synchronized  SingletonDemo  getInstance(){
			if(null==singletonDemo){
				singletonDemo=new SingletonDemo()
			}
			return  singletonDemo; 
		}
}
双重检测单例模式
public class SingletonDemo{
/**必须加volatile  关键字 否则可能回去空对象
	private  volatile  static  SingletonDemo singletonDemo;

	private SingletonDemo(){} 

	public static   SingletonDemo  getInstance(){
			if(null==singletonDemo){
				synchronized(SingletonDemo.class){
					if(null==singletonDemo){
						singletonDemo=new SingletonDemo ();
					}
				}
			}
			return  singletonDemo; 
		}
}
静态内部类方式(推荐)
public class SingletonDemo{

	private  static  SingletonClass (){
		private static final SingletonDemo instance=new SingletonDemo ();
	}

	private SingletonDemo(){} 

	public static   SingletonDemo  getInstance(){
		return SingletonClass.instance;
		}
}
枚举单例模式
public enum SingletonDemo{
	/**枚举本身就是单例的
	INSTANCE;
	//添加业务操作
	public void method(){
	}
}
选用:

占用资源少,不需要延迟加载:

反射和反序列化可以破解以上的除了枚举 的其他单例模式(枚举基于jvm底层实现的天然单例)

破解方式(以懒汉模式为例)

反射破解
Class<SingletonDemo>  clazz =(Class<SingletonDemo>) Class.forName("com.**.SingletonDemo")
Constructor<SingletonDemo>  c=clazz.getDeclaredControctor(null);
c.setAccesssible(true);
SingletonDemo  s1=c.newInstance();
SingletonDemo  s2=c.newInstance();
两个对象地址自不一样

反序列化破解
写
SingletonDemo  s3=SingletonDemo.getInstance();
FIleOutputStream fos = new FileOutputStream("d:/a.txt")
ObjectOutputStream oos = new ObjectOutputStream (fos)
oos.writeObject(s1)
oos .close; 
fos.close

读
ObejcetInputStream ois = new ObejcetInputStream (new FileInputStream ("d:/a.txt"))
SingletonDemo   s4= (SingletonDemo)  ois .readObject()
s3和s4的地址不同

防止破解

防止反射(在私有构造器加入判断如下)
private SingletonDemo(){
	if(null  !=  instance){
		throw new RuntimeException();
	}
}


防止序列化破解(在类里面加入一个方法)
/*反序列化时,如果定义了readResolve()则直接返回此方法返回的对象,而不需要单独再创建对象
private  Object readResolve() throws ObjectStreamException{
	return  instance
}

常见的应用场景

标签:singletonDemo,设计模式,模式,static,private,单例,SingletonDemo,加载
来源: https://blog.csdn.net/weixin_43704975/article/details/97614163