今天介绍第三种生成模式 - factory method (工厂模式)
这个模式的目的是,在定义一个生成物件的介面时,能够让子类别决定生成物件的过程中该具现化哪种类别物件。
将具现化过程延伸到子类别,让子类决定去修改、处置具现化流程中该产生何种物件。
白话的说,这个模式主要是在处理一个情境,就是当我今天写了一个负责专门生成别人物件的一个class,我今天想要抽换生成的物件类别要怎麽做。
这里的[专门生成别人物件]指的是生成一个复杂的大物件,里面有很多小物件等等。
这个模式的架构图如下 :
图片来源 (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++)
使用上跟MethodChannel类似,EventChannel即为MethodChannel与St...
强型闯入DenoLand[27] - Web API 介绍 终於来到本系列文的最终阶段 - Web...
工程师都有google的习惯,但是 bootstrap 的使用方式不用特别去估狗,基本的用法只要看官...
GKE GKE是GOOGLE在GCP上面的k8s cluster服务,对於GCP使用者来说,GKE可...
立即函式(IIFE) 立即执行的函式 限制变数作用域 无法在函式外被再次执行!! //立即函式,函式...