iT邦幫忙

2021 iThome 鐵人賽

DAY 3
1
Software Development

QT C++ 設計模式初學系列 第 3

生成模式 - abstract factory

首先從生成模式開始,第一種生成模式是 abstract factory (抽象工廠)
抽象工廠的目的是要讓同一個介面來建立一整族相關or相依賴的物件,並且在過程中不需明確的定義各個物件具象化的類別。
換句話說,若我要使用abstract factory模式,我可以在一個abstract factory類別裡面定義了好幾個介面,這些介面可能分別會產生類別A及類別B的物件,但不論是什麼類別,介面之間生成的物件彼此有關聯,或是互相依賴。
而這個介面我可以繼續沿用,拿來繼承並衍生新的類別,新的類別裡面會生產類別C跟類別D的物件,CD之間彼此關聯或互相依賴。但總之他們都是共用abstract factory最初的parent class定義的介面。

這裡我想了一個手機工廠的例子

一台手機的製造,需要螢幕、電池、記憶體、邊框、鏡頭、晶片組、天線、連接線等等的材料
所以可以知道製作一台手機就是需要那些東西
這邊把它拿來定義成一個抽象工廠類
意思是我完全不知道要買哪一家廠牌的材料來組成一台手機
但我就是知道手機需要那些材料!

using namespace std;
class abstractSmartphoneFactory {
public:
    virtual display*   getDisplay()   = 0;
    virtual battery*   getBattery()   = 0;
    virtual memory*    getMemory()    = 0;
    virtual frame*     getFrame()     = 0;
    virtual camera*    getCamera()    = 0;
    virtual chipset*   getChipset()   = 0;
    virtual antenna*   getAntenna()   = 0;
    virtual connector* getConnector() = 0;
    virtual operatingSystem* getOs()  = 0;
    
};

有了上面的物料清單(bill of material)
現在任何一家想進來手機市場分一杯羹的,都可以照這個工廠模板生產屬於自己的手機!
只是需要實際的採買上述的原料(也就是實作)
今天三星決定加入戰局,要開始做手機
於是把這個工廠拿來直接套用,蓋了一間自己的手機生產工廠

class samsungFactory() : public abstractSmartphoneFactory {
public:
    display*   getDisplay()   override { cout << "samsung amoled"; }
    chipset*   getChipset()   override { cout << "qualcomm snapdragon"; }
    operatingSystem* getOs()  override { cout << "android"; }
    /* 其他忽略,假設都有override所有pure virtual function */
};

那麼,當三星蓋好了工廠,他就可以生產手機了

class samsungCompany(){
public:
    smartPhone* createSmartPhone(abstractSmartphoneFactory* factory){
    display* d = factory->getDisplay();
    chipset* c = factory->getChipset();
    operatingSystem* os = factory->getOs();
    
    }
}

int main(){
    samsungCompany* company = new SamsungCompany;
    abstractSmartphoneFactory* factory = new samsungFactory;
    company.createSmartPhone(factory);
    return 0;
}

若今天蘋果也要來做手機...
他可以拿 abstractSmartphoneFactory 去繼承
實作出 A series 晶片組、實作出自己的 display、還有apple專屬的iOS
熱騰騰的蘋果手機工廠就會誕生啦!

以上就是abstract factory的簡單介紹
直接拿真的工廠來舉例,不知道好不好
不過先不管了,抽象工廠模式就是工廠阿!
最一開始的abstract class就是要負責打嘴砲,夠抽象了吧


上一篇
設計模式種類與建議研讀方法
下一篇
生成模式-builder
系列文
QT C++ 設計模式初學5

尚未有邦友留言

立即登入留言