概述
有时候某些对象我们只需要一个,如:线程池、缓存、对话框等等,对于这类对象我们只能有一个实例
单例模式确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例
特点
1 只能有一个实例 2 类自己创建自己的唯一实例 3 给所有其他对象提供这一实例
饿汉式
class EagerSingleton{ private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton(){} public static EagerSingleton getInstance(){ return instance; } }
懒汉式
class EagerSingleton{ private static EagerSingleton instance = null; private EagerSingleton(){} public static synchronized EagerSingleton getInstance(){ if (instance == null) { instance = new EagerSingleton(); } return instance; } }
饿汉式单例类在自己被加载时就将自己实例化,即便加载器是静态的。单从资源利用效率角度来讲,这个比懒汉式单例类稍差。从速度和反映时间来讲,比饿汉式单例好,
在Java语言内,Java.lang.Runtime对象就是一个使用单例模式的例子,在每个Java应用程序里,都有一个唯一的Runtime对象。通过这个对象程序可以与运行环境发生相互作用
四、模式优缺点
优点
一、节约了系统资源。由于系统中只存在一个实例对象,对与一些需要频繁创建和销毁对象的系统而言,单
例模式无疑节约了系统资源和提高了系统的性能。
二、因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。
缺点
一、由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
二、单例类的职责过重,在一定程度上违背了“单一职责原则”。
五、模式使用场景
下列几种情况可以使用单例模式。
一、系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器,或者需要考虑资源消耗太大而只允许创建一个对象。
二、客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。
六、总结
1. 单例模式中确保程序中一个类最多只有一个实例。
2. 单例模式的构造器是私有了,而且它必须要提供实例的全局访问点。
3. 单例模式可能会因为多线程的问题而带来安全隐患。