多例模式

上篇文章,咱們說過了單例模式,有童鞋會問:有單例,是否是有多例?答案:是的,這篇文章,咱們來聊一下多例模式。數據庫

多例模式,就是一個類有多個實例,並且該實例都是該類自己。這樣的類叫作多例類,具備如下:設計模式

  • 多例類能夠有多個實例。
  • 多例類必須本身建立、管理本身的實例,並向外界提供本身的實例。

簡單囉嗦一句,跟普通咱們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鏈接的處理就是用的單例模式。對象

相關文章
相關標籤/搜索