1. 程式人生 > >設計模式 (四)——簡單工廠模式(Simple Factory,建立型)

設計模式 (四)——簡單工廠模式(Simple Factory,建立型)

1.概述

使用設計模式可以提高程式碼的可複用性、可擴充性和可維護性。簡單工廠模式(Simple Factory Pattern)屬於建立型模式。簡單工廠模式,由一個工廠物件決定創建出哪一種產品類的例項,它經常被用於封裝建立物件的程式碼。

簡單工廠模式類圖結構:
這裡寫圖片描述

SimpleFactory:簡單工廠類,簡單工廠模式的核心,它負責實現建立所有例項。簡單工廠建立產品的方法可以被外界直接呼叫來建立所需的產品物件。
IProduct:抽象產品類,簡單工廠模式建立的所有物件的父類,它負責描述所有例項所共有的公共函式介面。
ConcreteProduct:具體產品類,是簡單工廠模式的建立目標。

2.簡單工廠模式舉例

假如比薩店現在需要建立一套點餐系統,需要將客戶點的比薩加入到賬單中。比薩店向客戶推出了不同口味的比薩,有蛤蜊披薩(Clam Pizza)、素食披薩(Veggie Pizza)和芝士比薩(Cheese Pizza)等。這就用到了簡單工廠模式。下面以C++來實現簡單工廠模式:

建立抽象產品類Pizza

class Pizza {
public:
    //純虛擬函式(抽象函式介面)
    virtual string getDescription() = 0;
};

建立具體產品類。接著我們建立各個口味的比薩,它們都繼承了抽象父類Pizza ,並實現了父類的getDescription方法。

//蛤蜊比薩
class ClamPizza :public Pizza {
    string name="蛤蜊比薩";
public:
    string getDescription() {
        return name + " 價格45元";
    }
};

//素食比薩
class VeggiePizza :public Pizza {
    string name = "素食比薩";
public:
    string getDescription() {
        return name+ " 價格26元";;
    }
};

//芝士比薩
class CheesePizza :public
Pizza { string name = "比薩"; public: string getDescription() { return name + " 價格38元";; } };

建立簡單工廠類。接下來建立一個簡單工廠類,它提供了一個靜態方法createPizza用來生產比薩。你只需要傳入你想生產的比薩名稱,它就會例項化相應比薩物件:

enum PizzaName {CLAM,VEGGIE,CHEESE};
class PizzaFactory {
public:
    static Pizza* createPizza(PizzaName name) {
        Pizza* pizza = nullptr;
        switch (name){
            case CLAM:
                pizza = new ClamPizza();
                break;
            case VEGGIE:
                pizza = new VeggiePizza();
                break;
            case CHEESE:
                pizza = new CheesePizza();
                break;
        }
        return pizza;
    }
};

客戶端呼叫工廠類。客戶端呼叫簡單工廠類,傳入不同口味比薩的名稱生產出比薩並呼叫該物件getDescription()方法:

#include <iostream>  
#include <string>
using namespace std;

int main() {
    cout<<PizzaFactory::createPizza(CLAM)->getDescription()<<endl;
    cout<<PizzaFactory::createPizza(VEGGIE)->getDescription()<<endl;
    cout<<PizzaFactory::createPizza(CHEESE)->getDescription()<<endl;
}

程式輸出結果:

蛤蜊比薩 價格45元
素食比薩 價格26元
比薩 價格38元

3.簡單工廠模式使用場景和優缺點

使用場景:
(1)工廠類負責建立的物件比較少。
(2)客戶只知道傳入工廠類的引數,對於如何建立物件(邏輯)不關心。

優點:
使使用者根據引數獲得對應的類例項,避免了直接例項化類,降低使用者程式碼與目標類間的耦合性。

缺點:
可例項化的型別在編譯期間已經被確定,如果增加新型別,則需要修改簡單工廠類,違背了開放封閉原則(Open Closed Principle) 。 簡單工廠需要知道所有要生成的型別,當子類過多或者子類層次過多時不適合使用。

4.小節

(1)簡單工廠模式滿足了OO設計原則:為互動物件之間的鬆耦合設計而努力。
(2)簡單工廠模式,由一個工廠物件決定創建出哪一種產品類的例項,它經常被用於封裝建立物件的程式碼。

參考

[1]設計模式(四)簡單工廠模式
[2]Freeman E.,Freeman E.,Sierra K.,et al.設計模式[M].第一版O’Reilly Taiwan公司譯.北京:中國電力出版社,2015:110-117