Java设计模式(单例模式)

概念

单例模式:1.某个类只能有一个实例。2.它必须自行创建这个实例。3.它必须自行向整个系统提供这个实例。
如何实现:构造函数私有化,防止外部对它实例化,类内部提供一个静态的工厂方法生成该唯一实例,且该方法是public的,提供一个自身的静态私有成员变量,用于存储生成的唯一实例。
单例模式由于构造函数是私有的,故该类不能被继承。
实例:饿汉式和懒汉式单例模式,懒汉式在多线程环境中要注意使用同步机制

实例

class EagerSingleton{
	/*饿汉式,在类加载时就将自己实例化*/
	private static final EagerSingleton eagerSingleton = new EagerSingleton();
	private EagerSingleton() {
		
	}
	public static EagerSingleton getInstance() {
		return eagerSingleton;
	}
}
class LazySingleton{
	/*懒汉式,在类加载时不会被实例化,只在第一次被引用时将自己实例化*/
	private static LazySingleton lazySingleton;
	private LazySingleton() {
		
	}
	/*synchronized*/ public static LazySingleton getInstance() {
		if(lazySingleton == null) {
			System.out.println("第一个");
			lazySingleton = new LazySingleton();
		}
		return lazySingleton;
	}
}
public class TestT {
	public static void main(String[] args) {
		EagerSingleton e1 = EagerSingleton.getInstance();
		EagerSingleton e2 = EagerSingleton.getInstance();
		LazySingleton l1 = LazySingleton.getInstance();
		LazySingleton l2 = LazySingleton.getInstance();
		System.out.println(e1+"<>"+l1);
		System.out.println(e2+"<>"+l2);
	}
}

运行结果:
第一个
cn.my.test1.EagerSingleton@16b4a017<>cn.my.test1.LazySingleton@8807e25
cn.my.test1.EagerSingleton@16b4a017<>cn.my.test1.LazySingleton@8807e25

比较

名称 区别
饿汉式 资源利用效率稍差(类加载时就将自己实例化)
懒汉式 速度和反应时间稍好,但要处理好多线程环境的同步问题(假如有多个线程同时引用此类,可以会生产出多个不同的实例对象,这就不符合单例模式了,故可以用同步锁加以限制,即在静态方法前加个synchronized关键字,或其他方式)

你可能感兴趣的:(Java设计模式(单例模式))