建造者模式(套餐模式)
Posted 顾文繁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建造者模式(套餐模式)相关的知识,希望对你有一定的参考价值。
这里说建造者模式是一种套餐模式,哈哈哈,套餐指的就是实现建造者抽象类的类。
建造者模式事最复杂的创建型模式,它将客户端与包含多个组成部分的复杂对象的创建过程分类,客户端无需知道内部组成部分与装配方式,只需要知道建造者的类型即可。
定义
该模式用于创建一个包含多个组成部分的复杂对象,可以返回一个完整的对象给用户,即就是给需要创建复杂对象的各个成员变量进行赋值,赋什么值。建造者关注复杂对象如何一个一个创建完成的。而作为使用者,则不关心。
建造者模式包含下面几个角色
1 Builder(抽象建造者)
在该抽象类中,一般有两种函数,一种是构建复杂对象的部分函数buildPart_X,和返回构造结果的getResult函数。相当于我要在KFC里面点一个含有n个食物的套餐,Builder中就要构造这n个食物🍜,把要这个套餐通过定义的函数给构造出来。
2 ConcreteBuilder(具体建造者/具体套餐配方)
这个类实现Builder,具体制定构造什么样的目标对象。相当于KFC里面有一个午餐套餐,但是这个午餐套餐有好多种,每种套餐含有两种食物,第一种套餐是面条+可乐,第二种套餐是米饭+咖啡,第三种套餐是百吉饼+稀饭(实在想不出来中午有啥可吃的)......在该类中实现Builder的函数。
3 Product(目标产品)
Product就是复杂对象,也即是目标产品(上面列子说的KFC里的午餐套餐)。
4 Director(指挥者)
在这个类中,负责将Builder中的函数按照某种次序进行构造,比如先套餐一种,先煮面条,然后再酿造可乐,将这个步骤封装在一个函数construct()中。
类图
下面的类图展示了套餐模式的基本构造。
KFC生产套餐(C/C++)
下面介绍利用构建者模式进行KFC制造套餐
产品类
//
// Created by wenfan on 2021/6/23.
//
#ifndef PATTERN_DESIGN_PRODUCT_H
#define PATTERN_DESIGN_PRODUCT_H
#include <iostream>
#include <string>
class Product{
public:
void setFood(const string& food){
m_food = food;
}
void setDrink(const string& drink){
m_drink = drink;
}
void showFood(){
std::cout << "food : " << m_food << ", drink : " << m_drink << endl;
}
private:
string m_food;
string m_drink;
};
#endif //PATTERN_DESIGN_PRODUCT_H
构建者
//
// Created by wenfan on 2021/6/23.
//
#ifndef PATTERN_DESIGN_BUILDER_H
#define PATTERN_DESIGN_BUILDER_H
#include "Product.h"
class Builder{
public:
virtual bool buildFood() = 0;
virtual bool buildDrink() = 0;
Product& getResult(){
std::cout << "Builder正在出餐" << endl;
return product;
}
protected:
Product product;
};
#endif //PATTERN_DESIGN_BUILDER_H
具体构建者(KFC)
//
// Created by wenfan on 2021/6/23.
//
#ifndef PATTERN_DESIGN_KFCBUILDER_H
#define PATTERN_DESIGN_KFCBUILDER_H
#include "Builder.h"
class KFCBuilder : public Builder{
public:
KFCBuilder(){
cout << " KFCBuilder 正在创建" << endl;
}
virtual bool buildFood(){
cout << " KFCBuilder 正在制造黄焖鸡米饭" << endl;
this->product.setFood("黄焖鸡米饭");
}
virtual bool buildDrink(){
cout << " KFCBuilder 正在制造可口可乐" << endl;
this->product.setDrink("可口可乐");
}
};
#endif //PATTERN_DESIGN_KFCBUILDER_H
指挥者
//
// Created by wenfan on 2021/6/23.
//
#ifndef PATTERN_DESIGN_DIRECTOR_H
#define PATTERN_DESIGN_DIRECTOR_H
class Director{
public:
Director(Builder* builder){
if(builder != nullptr){
m_builder = builder;
}
}
Product& construct(){
if(m_builder){
m_builder->buildDrink();
m_builder->buildFood();
return m_builder->getResult();
}
}
private:
Builder* m_builder = nullptr;
};
#endif //PATTERN_DESIGN_DIRECTOR_H
测试
void test_builder(){
Director director(new KFCBuilder);
cout << "director 开始让KFC制作食物" << endl;
Product& product = director.construct();
cout << "制作完成" << endl;
product.showFood();
}
KFC制作结果
以上是关于建造者模式(套餐模式)的主要内容,如果未能解决你的问题,请参考以下文章