创建型模式:单例模式

321 阅读2分钟

001.定义

一个类有且仅有一个实例,并且自行实例化向整个系统提供

002.目的

使得类的一个对象成为该类系统中唯一实例

003.单例模式优缺点

  • 优点
    • 在内存中只有一个对象,节省内存空间
    • 避免频繁的创建销毁对象,提供性能
    • 避免对共享资源的多重占用
  • 缺点
    • 扩展比较困难
    • 如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,造成对象状态丢失

004.常见的写法

  • 饿汉式
  • 懒汉式

005.实现步骤

  • 将构造函数私有化
  • 在类的内部创建实例
  • 提供获取唯一实例的方法

006.几种写法

  • 饿汉式
    • 线程安全、非懒加载、效率高
public class Singleton{
    //将构造函数私有化
    private Singleton(){}
    //在类的内部创建实例
    private static Singleton instance=new  Singleton();
    //提供获取唯一实例的方法
    public static Singleton  getInstanse(){		
    	return instance;
    }	
}
  • 懒汉式
    • 线程不安全、懒加载、效率低
    • 解决线程安全办法
      • 1.同步锁、双重校验锁、静态内部类、枚举
public class Singleton{
    private static Singleton instance;
    private Singleton(){}
    public static Singleton  getInstanse(){
    	if(instance == null){
    		instance = new Singleton();
    	}
    	return instance;
    }
}
  • 双重校验锁
    • 线程安全、懒加载、效率高
public class Singleton(){
    private static volatile Singleton singleton = null;  
     private Singleton() { } 
     
     public static Singleton getSingleton() {
    	 if (singleton == null) {        
    		 synchronized (Singleton.class) { 
    			 if (singleton == null) {              
    				 singleton = new Singleton();             
    			 	}           
    		 	}       
     		}        
 	    return singleton;    
     }
}
  • 静态内部类
    • 线程安全、懒加载、效率高
publi class Singleton(){
    private Singleton(){ }
    private static class SingletonInstance{
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance(){
        return SingletonInstance.INSTANCE;
    }
}

007.饿汉式和懒汉式比较

  • 饿汉式在类加载时就创建实例,第一次加载速度快;
  • 懒汉式第一次使用时才进行实例化,第一次加载速度慢;
  • 饿汉式是空间换时间,而懒汉式是时间换空间;
  • 饿汉式线程安全,懒汉式存在线程风险;
    • 解决方案(1.同步锁、双重校验锁、静态内部类、枚举)

008.适用场景

  • 需要频繁的进行创建和销毁的对象
  • 创建对象时占用资源过多,但同时又需要用到该类对象
  • 对系统内资源要求统一读写,如读写配置信息

参考资料: