1. 程式人生 > >PHP面向物件-工廠、抽象工廠模式

PHP面向物件-工廠、抽象工廠模式

工廠模式,是用工廠方法代替new操作的一種模式。其實也可以將其理解成為一個建立物件的工具類。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。

  • 優點:
  1. 一個呼叫者想建立一個物件,只要知道其名稱就可以了。
  2. 擴充套件性高,如果想增加一個產品,只要擴充套件一個工廠類就可以。
  3. 遮蔽產品的具體實現,呼叫者只關心產品的介面。
  • 缺點:

每次增加一個產品時,都需要增加一個具體類和物件實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。

  • 主要解決:

主要解決介面選擇的問題。

  • 何時使用:

我們明確地計劃不同條件下建立不同例項時。

  • 應用場景:
  1. 日誌記錄器:記錄可能記錄到本地硬碟、系統事件、遠端伺服器等,使用者可以選擇記錄日誌到什麼地方。
  2. 資料庫訪問,當用戶不知道最後系統採用哪一類資料庫,以及資料庫可能有變化時。
  3. 設計一個連線伺服器的框架,需要三個協議,"POP3"、"IMAP"、"HTTP",可以把這三個作為產品類,共同實現一個介面。
  • 實現:

#介面類IApi.php
interface IApi{  
    public function draw();  
}  

#業務類 classA.php
class classA implements IApi{  
    public function draw(){  
        echo 'classA';  
    }  
} 

#業務類 classB.php
class classB implements IApi{  
    public function draw(){  
        echo 'classB';  
    }  
} 

#API呼叫 index.php
class Factory_Demo{  
    public function index($type=0)  
    {  
        if($type == 1 ){  
            $obj = new App\factory\classA();  
        }else{  
            $obj = new App\factory\classB();  
        }  
        $obj->draw();  
    }  
}  

$obj = new Factory_Demo();  
$obj ->index(2);  

實現效果

抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

在抽象工廠模式中,介面是負責建立一個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供物件。

  • 優點

當一個產品族中的多個物件被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的物件。

  • 缺點

產品族擴充套件非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加程式碼,又要在具體的裡面加程式碼。

  • 主要解決:

主要解決介面選擇的問題。

  • 何時使用:

系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。

  • 應用場景
  1. QQ 換面板,一整套一起換。
  2. 生成不同作業系統的程式。
  3. 商城的產品類別
  • 實現