设计模式-创建型04-建造者

一,动机

简而言之,这个模式为了构造一些复杂的对象。诸如汽车,它包括多个部件。对大多数用户而言,不必知道这些部件的装配细节,而是直接使用整个对象。



二,定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式是一步步创建一个复杂的对象。用户只通过指定复杂对象的类型和内容即可构建他们,例如宝马汽车。。不需要知道内部的具体构造过程,例如,不需要知道是先装轮子还是先装配发动机。




三,模式结构

1,Builder(抽象构造者)

规定了产品对象的各个部件的指定接口。在该接口中,一般声明两类方法:a,buildPartX,用于构造复杂对象的各个部件。b,getResult。用于返回复杂对象

2,ConcreteBuilder(具体构造者)

实现抽象构造的接口

3,Product(产品角色)

被构造的复杂对象

4,Director(指挥者)

负责安排复杂对象的构造次序。 其包含一个construct方法来进来逐部件构造


四,代码实例

以订购套餐为例:提供A,B两种套餐

其中服务员充当指挥者角色。

#include <iostream>

using namespace std;

class Meal
{
private:
        string food;
        string drink;
public:
        void setFood(string tmp)
        {
            this->food = tmp;
        }
        void setDrink(string tmp)
        {
            this->drink = tmp;
        }
        string getFood()
        {
            return food;
        }
        string getDrink()
        {
            return drink;
        }

};

class MealBuilder
{
protected:
        Meal* meal;
public:
        virtual void buildFood() =0;
        virtual void buildDrink()=0;
        MealBuilder()
        {
            SetMeal(new Meal());
        }
        void SetMeal(Meal* tmp)
        {
            this->meal = tmp;
        }
        Meal* getMeal()
        {
            return meal;
        }
};

class SubMealBuilderA :public MealBuilder
{
public:

    void buildFood()
    {
        meal->setFood("汉堡包");
    }
    void buildDrink()
    {
        meal->setDrink("可口可乐");
    }
};
class SubMealBuilderB :public MealBuilder
{
    void buildFood()
    {
        meal->setFood("薯条鸡翅");
    }
    void buildDrink()
    {
        meal->setDrink("冰红茶");
    }
};
class Waiter
{
private:
    MealBuilder* mb;
public:
    void SetMealBuilder(MealBuilder* tmp_mb)
    {
        this->mb = tmp_mb;
    }
    Meal* construct()
    {
        mb->buildDrink();
        mb->buildFood();
        return mb->getMeal();
    }
};
int main()
{
    MealBuilder* tmp_mb = new SubMealBuilderB();
    Waiter tmp_wai;
    tmp_wai.SetMealBuilder(tmp_mb);
    Meal* tmp_meal = tmp_wai.construct();

    cout<<tmp_meal->getDrink()<<endl;
    cout<<tmp_meal->getFood()<<endl;

    return 0;
}

输出:

冰红茶
薯条鸡翅
要是应用Java反射机制就显得特别方便了。可以在配置文件中指定构造的套餐。


缺点:

构造的产品必须有统一的配置。对于上述例子,都必须是 Food + Drink 假如有其他附属品就不可以应用这种模式了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值