iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
Software Development

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

生成模式 - factory method

  • 分享至 

  • xImage
  •  

今天介紹第三種生成模式 - factory method (工廠模式)
這個模式的目的是,在定義一個生成物件的介面時,能夠讓子類別決定生成物件的過程中該具現化哪種類別物件。
將具現化過程延伸到子類別,讓子類決定去修改、處置具現化流程中該產生何種物件。

白話的說,這個模式主要是在處理一個情境,就是當我今天寫了一個負責專門生成別人物件的一個class,我今天想要抽換生成的物件類別要怎麼做。

這裡的[專門生成別人物件]指的是生成一個複雜的大物件,裡面有很多小物件等等。

這個模式的架構圖如下 :
https://ithelp.ithome.com.tw/upload/images/20210920/20140442GbdpIJl7Q3.png
圖片來源 (https://refactoring.guru/design-patterns/factory-method)

其中,我們的重點著重在那個Creator以及所有衍生的ConcreteCreator
想盡辦法讓Creator可以生成product(如果不是abstract class),ConcreteCreator可以生成ConcreteProduct

這裡繼續沿用之前的abstract factory手機工廠例子
現在模板工廠介面長這樣
模板工廠有一個生產流程的介面,以及手機零件的虛擬函數

class abstractSmartphoneFactory {
public:
    smartPhone* producePhone(){
        smartPhone phone = new smartPhone;
        phone.addPart( getDisplay() );
        phone.addPart( getChipset() );
        phone.addPart( getOs() );
        phone.addPart( getBaseboard() );
        return phone;
    }
    
    virtual display*   getDisplay()  { cout << "LED display"; }
    virtual chipset*   getChipset()  { cout << "mediaTek chipset"; }
    virtual operatingSystem* getOs() { cout << "android OS"; }
    virtual baseboard* getBaseboard(){ cout << "public baseboard"; }
    
};

當今天apple公司委託代工廠蓋了一間專屬手機工廠
他要使用自己的chipset, OS, display,所以他必須替換掉模板工廠提供的基本零件解決方案
所以他覆寫了parent class之中手機零件的函數

class appleFactory() : public abstractSmartphoneFactory {
public:
    display*   getDisplay()   override { cout << "apple OEM amoled"; }
    chipset*   getChipset()   override { cout << "A series chipset"; }
    operatingSystem* getOs()  override { cout << "apple iOS"; }
};

所以屬於蘋果的代工廠製造的手機,就會是自己的晶片、螢幕還有作業系統了!

int main(){
    abstractSmartphoneFactory* factory = new appleFactory;
    factory->productPhone(); // a phone with apple's display, OS and chipset
    return 0;
}

上一篇
生成模式-builder
系列文
QT C++ 設計模式初學5
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言