设计模式 单例模式

单例模式:保证一个类只有一个实例,并提供了一个全局的访问点。

优点:

1)单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,例如读取配置、产生其它依赖对象时,可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。

2)单例模式可以在系统设置全局的访问点,优化共享资源的访问,例如可以设计一个单例类,负责所有数据表的映射处理。

常见的单例模式实现方式:

主流:

1)饿汉式(线程安全、调用效率高,但是不可以延时加载)

2)懒汉式(线程安全,调用效率不高,但是可以延时加载)

其它:

1)双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题)

2)静态内部类式(线程安全,调用效率高,而且可以延时加载)

3)枚举单例(线程安全,调用效率高,但是不能延时加载)

应用:windows的任务管理器、spring当中的每个Bean默认为单例的还有就是数据库的连接池的设计一般为单例的,数据库连接是一种数据库资源,网站的计数器一般也采取单例模式,方便同步,Servlet编程当中,每个Servlet也是单例的。

 实现代码:

1)饿汉式:

package com.Singleton;
/**
 * 测试饿汉式的单例模式
 * @author Dell
 *
 */
public class SingletonDemo01 {
	/**
	 * 类初始化时立即加载
	 * 加载类时是天然的线程安全的
	 */
	private static SingletonDemo01 instance = new SingletonDemo01();	
	private SingletonDemo01(){
	}
	//方法无需同步,调用效率高
	public static SingletonDemo01 getInstance(){
		return instance;
	}
}

2)懒汉式:

package com.Singleton;

public class SingletonDemo02 {
	//不在此进行实例化,延迟加载,真正使用时在进行加载
	private static SingletonDemo02 instance;
	//私有化构造器
	private SingletonDemo02(){
	}
	//方法同步,调用效率低
	public static synchronized SingletonDemo02 getInstance(){
		if(instance==null){
			instance = new SingletonDemo02();
		}
		return instance;
	}
}

3)静态内部类

package com.Singleton;
/**
 * 静态内部类实现单例模式
 * 这种方式线程安全、调用效率高并实现了延时加载
 * @author Dell
 *
 */
public class SingletonDemo03 {
	private static class SingletonClassInstance{
		private static final SingletonDemo03 instance = new SingletonDemo03();
	}
	
	public static SingletonDemo03 getInstance(){
		return SingletonClassInstance.instance;
	}
	
	private SingletonDemo03(){
	}
}

4)枚举单例模式

package com.Singleton;
/**
 * 避免了反射和反序列化的漏洞,效率高
 * 枚举方式没有延时加载的效果
 * @author Dell
 *
 */
public enum SingletonDemo04 {
	//这个枚举元素本身就是单例对象
	instance;
	
	public void SingletonDemo04(){
	}
}

测试类:

package com.Singleton;

public class Client {
	public static void main(String[] args) {
		SingletonDemo01 s1 = SingletonDemo01.getInstance();
		SingletonDemo01 s2 = SingletonDemo01.getInstance();
		System.out.println(s1);
		System.out.println(s2);
		
		SingletonDemo02 s3 = SingletonDemo02.getInstance();
		SingletonDemo02 s4 = SingletonDemo02.getInstance();
		System.out.println(s3);
		System.out.println(s4);
		
		SingletonDemo03 s5 = SingletonDemo03.getInstance();
		SingletonDemo03 s6 = SingletonDemo03.getInstance();
		System.out.println(s5);
		System.out.println(s6);
		
		SingletonDemo04 s7 = SingletonDemo04.instance;
		SingletonDemo04 s8 = SingletonDemo04.instance;
		System.out.println(s7);
		System.out.println(s8);
		
		
	}
}

 测试结果:

态度决定高度,细节决定成败,
原文地址:https://www.cnblogs.com/lxk2010012997/p/4797997.html