上篇文章,咱們說過了單例模式,有童鞋會問:有單例,是否是有多例?答案:是的,這篇文章,咱們來聊一下多例模式。數據庫
多例模式,就是一個類有多個實例,並且該實例都是該類自己。這樣的類叫作多例類,具備如下:設計模式
簡單囉嗦一句,跟普通咱們new對象不同,咱們能夠屢次new對象,可是每次new的對象都是一個新的對象;而多例類裏面全部的實例都是該類自己。數組
下面咱們來看一下具體的代碼實現:
邏輯:CD工廠要不不一樣的內容受權給不一樣的工廠去生產:把CD1的內容讓工廠1生產;CD2的內容讓工廠2生產。這樣能夠減小CD工廠的數量,增長CD工廠的擴展性。函數
class CDFactory { /** * 實例對象數組 * * @var array */ private static $_instances = []; /** * 構造函數私有,防止類能夠經過 new 實例化 * * @access private * @return void */ private function __construct () { } /** * 私有化複製克隆方法,防止類別複製和克隆 * * @access private * @return void */ private function __clone () { } /** * 阻止實例被序列化 * * @access private * @return void */ private function __wakeup () { } /** * 定義獲取對象實例的入口,返回該實例 * * @access public * @param string $name 實例化名字 * @return self */ public static function getInstance (string $name) { // 判斷是否已經存在實例化對象 if (!isset(self::$_instances[$name])) { p('new intance:' . __CLASS__); // 不存在,則實例化一個 self::$_instances[$name] = new self(); } return self::$_instances[$name]; } /** * 此接口用來測試單例模式 - 改變 string 的值 * * @access public * @param string $string 值 * @return void */ public function setContent($string) { $this->string = $string; } /** * 此接口用來測試單例模式 - 輸出 string 的值 * * @access public * @return void */ public function getContent() { p('$this->string',$this->string); } }
調用的代碼:測試
class Client { static public function factory1Produce() { $cd = CDFactory::getInstance('CD1'); $cd->setContent('CD 1 內容~'); return $cd; } static public function factory2Produce() { $cd = CDFactory::getInstance('CD2'); $cd->setContent('CD 2 內容~'); return $cd; } /** * 主函數 */ static public function main() { //工廠1生產 $cd_1 = static::factory1Produce(); $cd_1->getContent(); //工廠2生產 $cd_2 = static::factory2Produce(); $cd_2->getContent(); } }
執行結果:this
new intance:CDFactory $this->string= string(12) "CD 1 內容~" new intance:CDFactory $this->string= string(12) "CD 2 內容~"
執行結果裏面咱們能夠看到,new intance:CDFactory調用了兩次,實現了一個類有多個實例,由於咱們的實例是存在 $_instances 數組中,因此每次new intance又都是CD類自己。設計
在實際應用中,多例模式能夠用在處理多個數據庫鏈接器等類似功能,可是不一樣實例的狀況。code
多例模式和單例模式是比較簡單的設計模式,同時也是被常常使用的設計模式,尤爲是單例模式,好比 ThinkPHP中的Cache就是用的多例模式,可是Redis鏈接的處理就是用的單例模式。對象