2.设计模式名称:建造者(Builder)
概念
建造者模式是一种创建型设计模式,它允许你将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式被用来构建一些复杂的对象,尤其是那些包含多个组成部分的对象。通过使用相同的构建过程可以生成不同的产品。
意图
- 将一个复杂对象的构造与其表示分离,使得同一个构建过程可以创建不同的表示。
- 更精细地控制复杂对象的构建过程。
适用性
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同的表示时。
结构
建造者模式通常涉及以下几个角色:
- Builder:为创建一个 Product 对象的各个部件指定抽象接口。
- ConcreteBuilder:实现 Builder 的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示。提供一个检索产品的接口。
- Director:构造一个使用 Builder 接口的对象。
- Product:表示被构造的复杂对象。ConcreteBuilder 构建的最终产品。
下面的交互图说明了Builder
和Director
是如何与一个客户协作的
实现代码示例
以下是一个使用建造者模式的 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
类来获取一个完成的车辆对象,而无需知道具体的构建细节。这种方式特别有用于创建那些构造过程复杂的对象。