php實現抽象工廠模式

小鎮程式設計師發表於2020-09-30

設計模式-使用php實現抽象工廠模式 

【概要】 
建立型模式 
抽象工廠模式提供一個建立一系統相關或相互依賴物件的介面,而無需指定它們具體的類【GOF95】 
【特點】 
抽象工廠模式(Abstact Factory)是一種常見的軟體設計模式。該模式為一個產品族提供了統一的建立介面。當需要這個產品族的某一系列的時候,可以為此係列的產品族建立一個具體的工廠類。 
【結構圖】 

 
【主要角色】 
抽象工廠(Abstract Factory)角色:它宣告一個建立抽象產品物件的介面。通常以介面或抽象類實現,所有的具體工廠類必須實現這個介面或繼承這個類。 
具體工廠(Concrete Factory)角色:實現建立產品物件的操作。客戶端直接呼叫這個角色建立產品的例項。這個角色包含有選擇合適的產品物件的邏輯。通常使用具體類實現。 
抽象產品(Abstract Product)角色:宣告一類產品的介面。它是工廠方法模式所建立的物件的父類,或它們共同擁有的介面。 
具體產品(Concrete Product)角色:實現抽象產品角色所定義的介面,定義一個將被相應的具體工廠建立的產品物件。其內部包含了應用程式的業務邏輯。 
【優缺點】 
抽象工廠模式的優點: 
1、分離了具體的類 
2、使增加或替換產品族變得容易 
3、有利於產品的一致性 

抽象工廠模式的缺點: 
難以支援新種類的產品。這是因為AbstractFactory介面確定了可以被建立的產品集合。支援新各類的產品就需要擴充套件訪工廠介面,從而導致AbstractFactory類及其所有子類的改變。 
抽象工廠就是以一種傾斜的方式支援增加新的產品中,它為新產品族的增加提供了方便,而不能為新的產品等級結構的增加提供這樣的方便。 
【適用性】 
1、一個系統不應當依賴於產品類例項如何被建立、組合和表達的細節,這對於所有形態的工廠模式都是重要的。 
2、這個系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。 
3、 同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。 
4、系統提供一個產品類的庫,所有的產品以同樣的介面出現,從而使用客戶端不依賴於實現 

【抽象工廠模式php例項】

<?php
 /**
 * 抽象工廠模式
 * -------------
 * @author         zhaoxuejie <zxj198468@gmail.com>
 * @package     design pattern 
 * @version     v1.0 2011-12-14
 */
 
//抽象工廠
interface AnimalFactory {
    
    public function createCat();
    public function createDog();
    
}
 
//具體工廠
class BlackAnimalFactory implements AnimalFactory {
    
    function createCat(){
        return new BlackCat();
    }
    
    function createDog(){
        return new BlackDog();    
    }
}
 
class WhiteAnimalFactory implements AnimalFactory {
    
    function createCat(){
        return new WhiteCat();
    }
    
    function createDog(){
        return new WhiteDog();
    }
}
 
//抽象產品
interface Cat {
    function Voice();
}
 
interface Dog {
    function Voice();    
}
 
//具體產品
class BlackCat implements Cat {
    
    function Voice(){
        echo '黑貓喵喵……';
    }
}
 
class WhiteCat implements Cat {
    
    function Voice(){
        echo '白貓喵喵……';
    }
}
 
class BlackDog implements Dog {
    
    function Voice(){
        echo '黑狗汪汪……';        
    }
}
 
class WhiteDog implements Dog {
    
    function Voice(){
        echo '白狗汪汪……';        
    }
}
 
//客戶端
class Client {
    
    public static function main() {
        self::run(new BlackAnimalFactory());
        self::run(new WhiteAnimalFactory());
    }
    
    public static function run(AnimalFactory $AnimalFactory){
        $cat = $AnimalFactory->createCat();
        $cat->Voice();
        
        $dog = $AnimalFactory->createDog();
        $dog->Voice();
    }
}
Client::main();
?>

相關文章