设计模式 单例模式
单例模式:保证一个类只有一个实例,并提供了一个全局的访问点。
优点:
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);
}
}
测试结果:

态度决定高度,细节决定成败,

浙公网安备 33010602011771号