生成模式 - 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就是要负责打嘴炮,够抽象了吧


<<:  Day3 program, process, thread傻傻分不清楚

>>:  Day18. Blue Prism制造齿轮 -BP Object页 将成绩写入Excel中

[Day 09] 简单的单元测试实作(三)

昨天我们已经测试了4这个数字, 但是除了4是闰年以外, 去年(2020年)应该也是闰年, 所以我们再...

找LeetCode上简单的题目来撑过30天啦(DAY17)

题号173 标题:Binary Search Tree Iterator 难度:Medium Imp...

Day04 把捷径真的变“捷径”吧

Hello 大家 今天是连假第二天, 突然想到前两年在写文章的时候好像也有遇到中秋连假, 去年我好像...

Progressive Web App 推播协定 (26)

之前已经可以用後端的套件去实作推播的服务器,但那个套件实际上做了哪些事情? 金钥对 Applicat...

Day10 X 实作一个简单的 Virtualized List 吧!

Facebook、Instagram 应该都是我们日常生活中非常依赖的社群媒体了,每天闲来无事就要...