生成模式 - factory method

今天介绍第三种生成模式 - 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;
}

<<:  [Day 15] Leetcode 138. Copy List with Random Pointer (C++)

>>:  【D20】制作讯号灯#4:加权指数成交金额讯号灯

Day16 开发套件 - 实作EventChannel

使用上跟MethodChannel类似,EventChannel即为MethodChannel与St...

强型闯入DenoLand[27] - Web API 介绍

强型闯入DenoLand[27] - Web API 介绍 终於来到本系列文的最终阶段 - Web...

Day20. 懂Bootstrap,并让Bootstrap带你上天堂

工程师都有google的习惯,但是 bootstrap 的使用方式不用特别去估狗,基本的用法只要看官...

[DAY28]GKE-Google Kubernetes Engine

GKE GKE是GOOGLE在GCP上面的k8s cluster服务,对於GCP使用者来说,GKE可...

[ JS个人笔记 ] 立即函式(IIFE) & 回呼函式 (Callback Function) —DAY7

立即函式(IIFE) 立即执行的函式 限制变数作用域 无法在函式外被再次执行!! //立即函式,函式...