今天要介绍的是生成模式中的 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
这次的任务是透过伪元素来打造立体盒子,同时利用background position属性来做出方块组...
程序语言百百种,C++的优势在哪? C++是一种使用广泛的电脑程序设计语言,继承C语言数据类型丰富、...
Day 1 介绍了用CSS 伪元素的方式放大缩小变宽去做连结特效。传送门 今天也选了几个button...
开始罗!准备好hello world了吗? 昨天我们讲完配置环境了,今天就开始写code吧! 开始吧...
本篇文章同步发表在 HKT 线上教室 部落格,线上影音教学课程已上架至 Udemy 和 Youtu...