一、簡介
多例模式被公認爲是 反面模式,爲了獲得更好的可測試性和可維護性,請使用『依賴注入模式』。
多例模式實際上就是單例模式的推廣,是指存在一個類有多個相同實例,而且該實例都是該類本身。這個類叫做多例類。 其的特點是:
- 多例類可以有多個實例。
- 多例類必須自己創建、管理自己的實例,並向外界提供自己的實例。
二、場景
- 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() {
}
}