设计模式-2.建造者(Builder) C++实现

2.设计模式名称:建造者(Builder)

概念

建造者模式是一种创建型设计模式,它允许你将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式被用来构建一些复杂的对象,尤其是那些包含多个组成部分的对象。通过使用相同的构建过程可以生成不同的产品。

意图
  • 将一个复杂对象的构造与其表示分离,使得同一个构建过程可以创建不同的表示。
  • 更精细地控制复杂对象的构建过程。
适用性
  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。
结构

建造者模式通常涉及以下几个角色:

  1. Builder:为创建一个 Product 对象的各个部件指定抽象接口。
  2. ConcreteBuilder:实现 Builder 的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示。提供一个检索产品的接口。
  3. Director:构造一个使用 Builder 接口的对象。
  4. Product:表示被构造的复杂对象。ConcreteBuilder 构建的最终产品。

在这里插入图片描述

下面的交互图说明了BuilderDirector是如何与一个客户协作的

在这里插入图片描述

实现代码示例

以下是一个使用建造者模式的 C++ 实例,其中模拟构建一个简单的汽车对象,包括轮子、引擎和车身。

#include <iostream>
#include <string>

// Product
class Car {
public:
    int wheels;
    std::string engine;
    std::string body;

    void specifications() {
        std::cout << "Body: " << body << std::endl;
        std::cout << "Engine: " << engine << std::endl;
        std::cout << "Wheels: " << wheels << std::endl;
    }
};

// Builder
class CarBuilder {
public:
    virtual ~CarBuilder() {}

    virtual void buildBody() = 0;

    virtual void buildEngine() = 0;

    virtual void buildWheels() = 0;

    virtual Car *getCar() = 0;
};

// Concrete Builder
class ConcreteCarBuilder : public CarBuilder {
private:
    Car *car;
public:
    ConcreteCarBuilder() {
        this->car = new Car();
    }

    ~ConcreteCarBuilder() {
        delete car;
    }

    void buildBody() override {
        car->body = "Sedan";
    }

    void buildEngine() override {
        car->engine = "V8";
    }

    void buildWheels() override {
        car->wheels = 4;
    }

    Car *getCar() override {
        return car;
    }
};

// Director
class Director {
public:
    Car *createCar(CarBuilder *builder) {
        builder->buildBody();
        builder->buildEngine();
        builder->buildWheels();
        return builder->getCar();
    }
};

// Client code
int main() {
    CarBuilder *builder = new ConcreteCarBuilder();
    Director director;

    Car *car = director.createCar(builder);
    car->specifications();

    delete builder; // This deletes the car as well due to the builder's destructor

    return 0;
}
输出
Body: Sedan
Engine: V8
Wheels: 4

在这个例子中,Director类负责按照特定顺序执行构建步骤,ConcreteCarBuilder类实现了构建具体部件的细节,而Car类是最终的产品。用户可以通过Director类来获取一个完成的车辆对象,而无需知道具体的构建细节。这种方式特别有用于创建那些构造过程复杂的对象。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值