設計模式05--多例模式(Multiton)

一、簡介

多例模式被公認爲是 反面模式,爲了獲得更好的可測試性和可維護性,請使用『依賴注入模式』。

多例模式實際上就是單例模式的推廣,是指存在一個類有多個相同實例,而且該實例都是該類本身。這個類叫做多例類。 其的特點是:

  • 多例類可以有多個實例。
  • 多例類必須自己創建、管理自己的實例,並向外界提供自己的實例。

二、場景

  • 2 個數據庫連接器,比如一個是 MySQL ,另一個是 SQLite
  • 多個記錄器(一個用於記錄調試消息,一個用於記錄錯誤)

三、類結構

多例模式結構如下:

角色 簡述
Multiton 一般是一個多例類或是接口

四、UML圖

五、代碼分析

final class Multiton
{
    const INSTANCE_1 = '1';
    const INSTANCE_2 = '2';
    /**
     * @var Multiton[]
     * 實例數組
     */
    private static $instances = [];
    /**
     * this is private to prevent from creating arbitrary instances
     * 構造方法聲明爲私有方法,禁止外部程序使用new實例化
     */
    private function __construct() {
    }

    // 這是獲取當前類對象的唯一方式
    public static function getInstance(string $instanceName): Multiton
    {
        if (!isset(self::$instances[$instanceName])) {
            self::$instances[$instanceName] = new self();
        }
        return self::$instances[$instanceName];
    }

    /**
     * prevent instance from being cloned
     *  聲明成私有方法,禁止克隆對象
     */
    private function __clone() {
    }

    /**
     * prevent instance from being unserialized
     * 聲明成私有方法,禁止重建對象
     */
    private function __wakeup() {
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章