职责型模式-单例模式(Singleton)

    通常,对象通过在自身属性上执行任务来承担自己的职责,除了需要维护自身的一致性外,无须承担其他任何职责。然而,仍有一些对象承担了更多的职责,例如对真实世界的实体进行建模、协调工作或者对整个系统的状态进行建模。当系统的其他对象都依赖于特殊对象所承担的职责是,我们需要通过某种方式找到这个承担职责的对象。例如,可能需要找到一个代表指定机器的对象,或者是从数据库获取数据来创建自身的客户对象,又或者是初始化系统内存用以恢复的对象。

    在某些场景,你需要找到一个承担职责的对象,并且这个对象是它所属类的唯一实例。

    单例模式的英文为Singleton。单例模式的意图是为了确保一个类有且仅有一个实例,并为它提供一个全局访问点。

    单例模式机制

        单例模式的机制比其意图更加容易记忆。解释如何保证一个类有且仅有一个实例,要比解释为何需要这种限制要简单的多。

        创建一个担当着独一无二角色的对象,有多种方式。但是,不管你如何创建一个单例对象,都必须确保其他开发人员不能创建该单例对象的新的实例。

        设计一个单例类时,需要确定何时实例化该类的单例对象。一种做法是创建这个类的实例,并将它作为该类的静态成员变量。例如,common/inject的DependencyManager类包含这一行:

	private static DependencyManager instance;

        这个类通过一个公共的getInstance()静态方法获得该类的唯一实例。

        如果不希望提前创建单例实例,还可以在第一次需要该实例时,延迟初始化它。例如,DependencyManager类采用如下方式获取单个实例:

	public static DependencyManager getInstance() {
		if (instance == null) {
			instance = new DependencyManager();
		}
		return instance;
	}

        无论哪种场景,单例模式都建议提供一个公共的静态方法去访问单例对象。如果该方法创建了一个对象,它就要保证只有一个实例可以被创建。

    单例和线程

        ...

    识别单例

        这种独一无二的对象并不罕见。事实上,因公程旭红的很多对象都承担了唯一的职责,既然如此,为何要创建拥有相同职责的两个对象?同样的,几乎每个类都拥有独一无二的角色,又何必为相同的类重复开发两次?然而,允许类只能拥有一个实例的单例类却极为罕见。事实上,一个对象或一个类是唯一的,并不意味着就是单例模式。

    小结

        单例模式保证了类仅有一个实例,并为其提供了一个全局访问点。通过延迟初始化(仅在第一次使用它时才初始化),一个单例对象是达到此目的的通用做法。

        对象具有唯一性,并不意味着使用了单例模式。单例模式通过隐藏构造函数,提供对象创建的唯一入口点,从而将类的职责集中在类的单个实例中。



发布了33 篇原创文章 · 获赞 2 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章