单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
一.单例模式的结构
1.单例模式的特点:
1.单例类只能有一个实例。
2.单例类必须自己创建自己的唯一的实例。
3.单例类必须给所有其他对象提供这一实例。
2.饿汉式单例类
public class EagerSingleton { private static final EagerSingleton m_instance = new EagerSingleton(); /** * 私有的默认构造子 */ private EagerSingleton(){}; /** * 静态工厂方法 * @return */ public static EagerSingleton getInstance(){ return m_instance; }}
3.懒汉式单例类
public class LazySingleton { private static LazySingleton m_instance = null; /** * 私有的默认构造子,保证外界无法直接实例化 */ private LazySingleton(){}; /** * 静态工厂方法,返还此类的唯一实例 * @return */ synchronized public static LazySingleton getInstance(){ if(m_instance == null){ m_instance = new LazySingleton(); } return m_instance; }}
注意:
1.与饿汉式单例类不同的是:饿汉式单例类第一次被引用时将自己实例化。
2.在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境。
二.在什么情况下使用单例模式
使用单例模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。
三.单例类的状态
1.有状态的单例类
一个单例类可以是有状态的,一个有状态的单例对象一般也是可变单例对象。
有状态的可变单例对象常常当做状态使用。比如一个单例对象可以持有一个int类型的属性,用来给一个系统提供一个数值唯一的序列号码,作为某个贩卖系统的账单号码。
2.没有状态的单例类
单例类也可以是没有状态的,仅用作提供工具性函数的对象。
![e7f202f55d6e354585738038c0032982.png](https://i-blog.csdnimg.cn/blog_migrate/67cf0ac27c12cd4290d840dbedd66594.jpeg)