欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式--单例模式

程序员文章站 2022-04-15 19:19:21
设计模式–单例模式单例模式1.作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。2.优点:由于单例模式只产生一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。3.常见的五种单例模式实现方式:饿汉式单例模式:/**********************...

设计模式–单例模式

单例模式

1.作用:

保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。

2.优点:

由于单例模式只产生一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。

3.常见的五种单例模式实现方式:

饿汉式单例模式:

/************************************饿汉式单例模式***************************************/
public class SingleDemo1 {
	//类初始化时立即加载这个对象(private确保不被调用,static全局声明实例,自己的类里声明初始化时立即加载)
	//即刻加载确保了加载的线程是安全的
	private static SingleDemo1 instance =new SingleDemo1();
	//私有化构造方法
	private  SingleDemo1() {}
	//将类初始化就加载的对象可间接被调用(public 确保可以被外界调用该方法,static确保得到实例唯一)
	//唯一,不同步,调用效率高
	public static SingleDemo1 getInstance() {
		return instance;
	}
	
}
/***************************************************************************************/

懒汉式单例模式:

/************************************懒汉式单例模式***************************************/
public class SingleDemo2 {
	//private私有变量,static全局变量,类中声明实例初始化时自动创建对象,但没有直接生成内存空间,提高了资源利用率
	private static SingleDemo2 s;
	//私有化构造方法
	private SingleDemo2() {};
	//public全局声明,static唯一实例,synchronized实现代码同步(一个线程正在访问,其他线程只能等待)使得并发效率降低
	//内部if判定,当s未被实例化的时候才创建对象,延迟加载,只有在用的时候才加载!
	public static synchronized SingleDemo2 getInstance() {
		if(s==null) {
			s=new SingleDemo2();
		}
		return s;		
	}
}
/***************************************************************************************/

双重检索式单例模式

/************************************双重检测锁式单例模式***************************************/
public class SingleDemo3 {
	//由于JVM底层内部模型原因,偶尔会出现问题,不建议使用
	//类初始化时立即加载这个对象(private确保不被调用,static全局声明实例,自己的类里声明初始化时立即加载)
	//初始化为空,方便后续判定。if的应用确保了只执行一次,也就是synchronized(SingleDemo3.class)同步化只进行一次
	private static SingleDemo3 instance=null;
	public static SingleDemo3 getInstance() {
		if(instance==null) {
			SingleDemo3 sc;
			synchronized(SingleDemo3.class) {
				sc=instance;
				if(sc==null) {
					synchronized(SingleDemo3.class) {
						if(sc==null) {
							sc=new SingleDemo3();
						}
					}
					instance=sc;
				}
			}
		}
		return instance;
	}
	private SingleDemo3() {}
}
/**********************************************************************************************/

静态内部类单例模式(强烈推荐)

/************************************静态内部类单例模式***************************************/
public class SingleDemo4 {
	//静态内部类单例模式兼备了并发高效调用和延迟加载的优势。
	//外部类没有static属性,因此不会立即加载对象
	private static class SingletonClassInstance{
		//static确保变量唯一,final确保只能被赋值一次,确保线程的安全
		private static final SingleDemo4 instance =new SingleDemo4();
	}
	//只有真正调用getInsatance()才会加载静态内部类,加载类时线程是安全的
	public static SingleDemo4 getInstance() {
		return SingletonClassInstance.instance;
	}
	//私有化构造方法
	private SingleDemo4() {}
}
/*******************************************************************************************/

枚举单例模式

/************************************枚举实现单例模式***************************************/
//enum枚举缩写
public enum SingleDemo5 {
	//实现简单,枚举本身就是单例模式。由JVM在根本上提供保障!避免通过反射和反序列化的漏洞!但是无延迟加载
	//这个枚举元素本身就是单例
	INSTANCE;
	//添加自己需要的操作
	public void singletonOperation() {
		
	}
}
/*****************************************************************************************/

4.总结

饿汉式(线程安全,调用效率高。但是,不能延迟加载。)
懒汉式(线程安全,调用效率不高。但是,可以延迟加载。)

其他:
双重检测锁式(由于JVM底层内部模型原因,偶尔会出现问题,不建议使用)
静态内部类式(线程安全,调用效率高。但是,可以延迟加载)
枚举单例(线程安全,调用效率高,不能延迟加载)

本文地址:https://blog.csdn.net/weixin_45476753/article/details/107352128