Java设计模式(单例模式)

概念 【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关键字,或其他方式)

    推荐阅读