设计模式学习(十) 建造者模式


这是个人学习编程模式的系列学习笔记第十篇。
采用Qt Creator进行编写,但尽量采用C++基础语法。
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
个人理解,建造者模式的思路同前面学习的模板方法模式(Template Method Pattern)思路类似。主体框架固定,具体实现不同,最后的结果不同。不过模板方法侧重于一个过程的执行,建造者模式侧重于大型对象的不同表示。
如果一个大型对象具有多个组成部分,但每个组成部分的构建不同,可以设计一个构建接口类,然后派生具体的构建类。再定义一个构建指挥者类,根据用户需求,调用对应的具体构建类,最后返回创建好的产品。
建造者模式同抽象工厂模式非常类似,都是通过一个统一的类创建不同的产品。区别主要是抽象工厂侧重于一次性创建不同种类的产品,建造者模式侧重于通过逐步构建,创建复杂的对象,有点像流水生产线组装,最后创建一个复杂产品。

场景描述

假设有一个高科技的汽车流水线工厂,可以根据用户的订单安排生产。用户指定车型,流水线马上开工,最后出厂的就是用户需要的车型。
这个流水线同别的流水线不同的是,别的流水线是生产同样的产品,这个流水线生产不同的产品。

设计思路

定义一个汽车生产调度类作为指挥者,定义一条汽车生产流水线作为构建接口类,这个接口类派生出各种具体型号的汽车每个环节的具体生产流程,按照这个生产流程,最终装配出来指定型号的汽车。

UML

在这里插入图片描述

代码

#include <iostream>
using namespace std;

class CarLine
{
public:
    virtual void assembleBody() = 0;
    virtual void assembleWheels() = 0;
    virtual void assembleEngine() = 0;
};

class CarModel1 : public CarLine
{
public:
    void assembleBody() {cout<<"a red body\n";}
    void assembleWheels() {cout<<"four road tires\n";}
    void assembleEngine() {cout<<"a 1.6L engine\n";}
};

class CarModel2 : public CarLine
{
public:
    void assembleBody() {cout<<"a black body\n";}
    void assembleWheels() {cout<<"four offroad tires\n";}
    void assembleEngine() {cout<<"a 3.0L engine\n";}
};

class Director
{
private:
    CarLine* m_car = 0;
public:
    Director(CarLine* car):m_car(car) {}
    ~Director() {delete m_car;}
    void creatCar()
    {
        m_car->assembleBody();
        m_car->assembleWheels();
        m_car->assembleEngine();
        cout<<"A new car producted!\n";
    }
};

int main()
{
    Director* order = new Director(new CarModel1());
    order->creatCar();
    delete order;
    order = new Director(new CarModel2());
    order->creatCar();
    delete order;

    return 0;
}

运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值