簡單工廠模式(Simple Factory Pattern)

簡單工廠模式

1. 啥時候使用簡單工廠模式
假設你是一家工廠的廠長,有一天,一名客戶找到你,並告訴你幫他生產一部黑色手機,於是你便通知了生產線開始生產黑色手機,生產成功後你將黑色手機交付客戶;又有一名客戶需要你幫他生產銀白色手機,你同樣與生產黑色手機一樣,通知生產線開始生產,成功後並交付客戶。由此可見你不需要知道工廠生產線是如何工作的,只需要知道此工廠的生產指令即可,此時,就可以使用簡單工廠模式。
2. 簡單工廠模式定義
簡單工廠模式(Simple Fctory Pattern):又稱爲靜態工廠方法(Static Factory Method)模式,它屬於類創建模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類負責創建其他類的實例,被創建的實例通常都具有共同的父類。

分析:簡單工廠是一個靜態的(當然非靜態也可以),提供一個類型標識(操作指令),可根據不同的標識生產不同的對象,但不同產品對象都在同一個工廠生產,同時不同產品必須源自於相同的對象。

舉個例子:簡單工廠就相當於一個家族,家族當中有很多的子女,但是他們都源自於同一個老祖宗,如果你想找他們幹活,就要通過這個家族,並告訴他,你現在想請誰幫忙幹活。
(我靠 這個有序列表老是給我搗亂,不知道怎麼調整,大家有好的辦法,可以分享下)

3 該模式中包含的角色及其職責

 **1)、Factory:工廠角色**
簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠內創建產品類的方法可被外界直接調用,根據產品標識創建所需的產品對象。
**2)、Product:抽象產品角色**
抽象產品角色是創建的所有對象的父類,負責描述所有實例所共有的公共接口。
**3)、ConcreteProduct:具體產品角色**
具體產品角色是創建目標,所有創建的對象都充當這個角色的某個具體類的實例。

這裏寫圖片描述

4. 擼代碼分析
PHP代碼哦

/**
 * 抽象產品角色:IProduct
 */
interface IProduct
{
    /**
     * 成員名稱1:method1()
     */
    public function method1();
    /**
     * 成員名稱2:method2()
     */
    public function method2();
}
/**
 * 具體產品角色:ConcreteProductA
 *
 */
class ConcreteProductA implements IProduct
{
    /**
     * 成員名稱1:method1()
     * {@inheritDoc}
     * @see \DesignPatterns\Creational\SimpleFactory\IProduct::method1()
     */
    public function method1(){
        //具體代碼實現
    }
    /**
     * 成員名稱2:method2()
     * {@inheritDoc}
     * @see \DesignPatterns\Creational\SimpleFactory\IProduct::method2()
     */
    public function method2(){
        //具體代碼實現
    }
}
/**
 * 具體產品角色:ConcreteProductB
 *
 */
class ConcreteProductB implements IProduct
{
    /**
     * 成員名稱1:method1()
     * {@inheritDoc}
     * @see \DesignPatterns\Creational\SimpleFactory\IProduct::method1()
     */
    public function method1(){
        //具體代碼實現
    }
    /**
     * 成員名稱2:method2()
     * {@inheritDoc}
     * @see \DesignPatterns\Creational\SimpleFactory\IProduct::method2()
     */
    public function method2(){
        //具體代碼實現
    }
}

/**
 1. 工廠角色:Factory
 2.  */
class Factory
{
    /**
     * 創建創建方法
     * @param int $productSign 產品標識
     * @return IProduct 抽象產品角色:IProduct
     */
    public static function createProduct($productSign){
        if ($productSign === 1){
            return new ConcreteProductA();
        } elseif ($productSign === 2){
            return new ConcreteProductB();
        }
    }
}
/**
 3. 測試簡單工廠
 4.  */
class TestSimpleFactory
{
    /**
     * 測試通過簡單工廠創建產品
     */
    public function testCreateProduct(){
        //創建具體產品角色:ConcreteProductA
        $product = Factory::createProduct(1);
    }
}

5. 簡單工廠模式的優點
工廠類是整個模式的關鍵,包含了必要的邏輯判斷,根據外界給定的信息,可以決定究竟應該創建哪一種產品類的實例,通過使用工廠類可以免除直接創建產品對象的責任,而僅僅需要負責“消費”產品就可以了。簡單工廠模式實現了對責任的分割,明確了各自的職責和權利,並提供了專門的工廠類用於創建對象。

使用者不需要關心具體產品類的類名稱,只需要知道具體產品類所對應的產品標識參數即可,對於複雜的類名稱,通過簡單工廠模式可以便於使用者記憶。

通過配置文件,可以在不修改任何使用者代碼的情況下更換具體產品類

6. 簡單工廠模式的缺點

由於工廠類集中了所有產品創建邏輯,一旦不能正常工作,則整個系統都要崩潰 。
如果需要添加新的類,則不得不修改工廠邏輯,在產品類型較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴展和維護。

7. 使用場景
以下情況可以使用簡單工廠模式:

工廠類負責創建的對象比較少;創建對象比較少,不會造成工廠方法中業務邏輯太過複雜。

使用者只知道傳入工廠類的參數,對於如何創建對象(邏輯)不關心。

注:由於簡單工廠很容易違反高內聚責任分配原則,因此一般只在很簡單的情況下應用。

名詞解釋:
高內聚:是指一個軟件模塊是由相關性很強的代碼組成,只負責一項任務,也就是常說的單一責任原則。

8. 總結

簡單工廠模式有一個靜態方法可供外部調用
創建對象與使用對象分離
所有被創建者都源自於一個老祖宗(基類)
根據傳入的不同參數返回不同類型的實例
簡單工廠模式都有三個角色組成,分別是工廠角色負責創建所有實例的內部邏輯;抽象產品角色是所有創建對象的基類,並負責描述共有的公共接口;具體產品角色創建目標,是具體產品角色的具體類的實例。
負責創建的對象比較少;使用者只需要關心工廠類的參數,對於如何創建對象(邏輯)不關心。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章