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

单例模式SINGLETON PATTERN

程序员文章站 2022-07-14 07:56:41
...

单例模式

规则:一个类只有一个实例

方法:

    不能被外部创建
    限制外部访问方式
    内部保证实例唯一

懒汉模式

    第一次调用的时候实例化,使用静态属性,存储单例
    设置私有构造器来限制外部访问
    使用静态方法获取单例
public class Singleton {

	/**
	 * 懒汉模式
	 */
	//静态属性,存储单例
	private static Singleton lazy=null;
	//设置私有构造器,限制外部无法通过构造器创建实例
	private Singleton() {}
	//静态方法获取单例
	public static Singleton getLazy() {
		if(lazy==null) {
			lazy=new Singleton();
		}
		return lazy;
		
	}
}

饿汉式

    初始化时自行实例化
    静态方法返回
public class SingleHurry {

	private static SingleHurry sh=new SingleHurry();
	private SingleHurry() {}
	public static SingleHurry getSh() {
		return sh;
	}
}

双重检查锁 DCL

    两次检查作用不同
    第一次检查是否为空,不为空不创建
    第二次检查保证单例
public class SingleDoubleChecking {

	private static SingleDoubleChecking sdc;
	private SingleDoubleChecking() {}
	private static SingleDoubleChecking getSdc() {
		//检查是否为空,不为空时不创建,节省性能消耗;为空时可能有并发问题
		if(sdc==null) {
			//同步代码块,保证不会被并发获取
			synchronized(SingleDoubleChecking.class) {
				//保证单例,再次判断,若不为空不建立实例
				if(sdc==null) {
					sdc=new SingleDoubleChecking();
				}
			}
		}
		return sdc;
	}
}

枚举法

   避免多线程同步问题
   防止反序列化重新创建新的对象
   使用enum
public enum SingleSe {

   //唯一实例,默认public static final的
	INSTANCE;
	public String name;
	public void doSomething() {
		System.out.println("doSomething");
	}
	public static void main(String[] args) {
		SingleSe.INSTANCE.doSomething();
	}
}