設計模式[創(chuàng)建型]05--多例模式(Multiton)

一、簡介

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

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

  • 多例類可以有多個實例。
  • 多例類必須自己創(chuàng)建、管理自己的實例,并向外界提供自己的實例。

二、場景

  • 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() {
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容