生成模式-builder

今天要介绍的是生成模式中的 builder (生成器模式)
这模式的目的是从复杂物件的布局中抽取生成程序,以便於可以使用同一个生成程序来制造各种不同的物件布局。
白话一点的方式就是说,若今天有一个生成起来会很复杂的大物件,或是需要很多前置步骤才能完整生成的物件,我可以把他们的生成程序抽出来,全部放到 builder 里面,把它们包成介面,所有在builder上的介面会包含所有生成大物件所需的程序。当我今天要生成这类大型物件,我就可以产生一个builder,设定好我要的生成的一些参数,最後直接从builder手上拿到我期望看到的物件。而这个builder中的介面若是虚拟函数,我就可以拿它来继承,覆写并衍生新的builder,获取不同种的大型物件。

白话解释之後,其实还是很复杂...(我觉得)

我们直接拿一个现实实例来比喻好了
我觉得builder就有点像比较日本会有的那种现代化现做食物贩卖机,里面的机械化烹饪设施
烹饪应该算是复杂的流程吧?
把烹饪的工作抽出来丢给烹饪机器做,你设计的贩卖机就不用管什麽碗物件、锅子物件、捞面用的勺子物件,你只管拿到客人要的餐点还有针对个人的产品客制化,这个时候烹饪机器就是一个builder物件!

class foodBuilder {
public:
    virtual void takeMaterial();
    virtual void cookTheMeal();
    virtual void putToContainer();
    virtual void doSeasoning();
    food* getFood();
};

这里把foodBuilder的每个制造流程都定义为virtual,
这样我们就可以拿它来继承并实作其他食物的制作

假设今天实作了面的制造流程

class noodleBuilder : public foodBuilder {
    void takeMaterial()   override;
    void cookTheMeal()    override;
    void putToContainer() override;
    void doSeasoning()    override;
};

贩卖机今天里面装了一台热食制造机
因为builder模式强调生成程序的抽出集中管理,因此一个采用foodBuilder的食物贩卖机,不用考虑备料、如何烹煮、要准备什麽器材等等,只需要知晓一套标准化的食物制造流程,还有一个可以让顾客点餐的介面。

class vendingMachine(){
public:
    enum sellingFood { Noodle, Rice }; /*定义贩卖机只有卖饭跟面*/
    
    food* order(sellingFood* food){ /*定义客人看的到的点餐介面*/
        switch(food){
        case Noodle : 
            foodBuilder* builder = new noodleBuilder;
            return cookCustomersMeal(builder);
        case Rice :
            /* 以下省略 */
        }
    }
    
private:
    food* cookCustomersMeal(foodBuilder* builder){ /*定义如何呼叫foodBuilder的介面*/
        builder->takeMateral();
        builder->cookTheMeal();
        builder->putToContainer();
        builder->doSeasoning();
        return builder->getFood();
    }
};

如果顾客去买贩卖机的东西...
只会有点餐和取餐的步骤,其他看不到

int main(){
    vendingMachine* machine = new vendingMachine;
    food* f;
    f = machine->order(vendingMachine::Noodle); 
    return 0;
}

以上就是生成模式中 builder (生成者模式) 的介绍


<<:  19.unity实例化(下)(Random、回圈、Prefab)

>>:  Day4 被动情蒐(1)-DNS、nslookup、host

#19. 3D Background Boxes

这次的任务是透过伪元素来打造立体盒子,同时利用background position属性来做出方块组...

[Day02] 程序菜鸟自学C++资料结构 – 简单QA

程序语言百百种,C++的优势在哪? C++是一种使用广泛的电脑程序设计语言,继承C语言数据类型丰富、...

#2 - Button文字换起来! (CSS: 移动位置)

Day 1 介绍了用CSS 伪元素的方式放大缩小变宽去做连结特效。传送门 今天也选了几个button...

Day 4 - hello world!!

开始罗!准备好hello world了吗? 昨天我们讲完配置环境了,今天就开始写code吧! 开始吧...

Day 23:获取位置权限

本篇文章同步发表在 HKT 线上教室 部落格,线上影音教学课程已上架至 Udemy 和 Youtu...