8.9.3 建造者模式
构建者模式又称为生成器模式,就是将一个复杂生成对象的过程拆分味多个步骤;主要是为了解决构造函数有非常多的可选参数的问题;
c++
class Pizza {
Pizza(int size) { ...... }
Pizza(int size, boolean cheese) { ...... }
Pizza(int size, boolean cheese, boolean pepperoni) { ...... }
// ......
示例代码:
java
// 下面的两个产品尽管没有同样的接口,但却相互关联。
// 一辆汽车可能配备有 GPS 设备、行车电脑和几个座位。不同型号的汽车(运动型轿车、SUV 和敞篷车)可能会安装或启用不同的功能。
class Car is
// 用户使用手册应该根据汽车配置进行编制,并介绍汽车的所有功能。
class Manual is
// 生成器接口声明了创建产品对象不同部件的方法。
interface Builder is
method reset()
method setSeats(......)
method setEngine(......)
method setTripComputer(......)
method setGPS(......)
// 具体生成器类将遵循生成器接口并提供生成步骤的具体实现。你的程序有多个以不同方式实现的生成器变体。
class CarBuilder implements Builder is
private field car:Car
// 一个新的生成器实例必须包含一个在后续组装过程中使用的空产品对象。
constructor CarBuilder() is
this.reset()
// reset(重置)方法可清除正在生成的对象。
method reset() is
this.car = new Car()
// 所有生成步骤都会与同一个产品实例进行交互。
method setSeats(......) is
// 设置汽车座位的数量。
method setEngine(......) is
// 安装指定的引擎。
method setTripComputer(......) is
// 安装行车电脑。
method setGPS(......) is
// 安装全球定位系统。
method getProduct():Car is
product = this.car
this.reset()
return product
// 生成器与其他创建型模式的不同之处在于:它让你能创建不遵循相同接口的产品。
class CarManualBuilder implements Builder is
private field manual:Manual
constructor CarManualBuilder() is
this.reset()
method reset() is
this.manual = new Manual()
method setSeats(......) is
method setEngine(......) is
method setTripComputer(......) is
method setGPS(......) is
method getProduct():Manual is
// 主管只负责按照特定顺序执行生成步骤。其在根据特定步骤或配置来生成产品
class Director is
method constructSportsCar(builder: Builder) is
builder.reset()
builder.setSeats(2)
builder.setEngine(new SportEngine())
builder.setTripComputer(true)
builder.setGPS(true)
method constructSUV(builder: Builder) is
// ......
// 客户端代码会创建生成器对象并将其传递给主管,然后执行构造过程。
class Application is
method makeCar() is
director = new Director()
CarBuilder builder = new CarBuilder()
director.constructSportsCar(builder)
Car car = builder.getProduct()
CarManualBuilder builder = new CarManualBuilder()
director.constructSportsCar(builder)
Manual manual = builder.getProduct()
示例的代码:
c++
#include <iostream>
#include <string>
// 产品类:汽车
class Car {
public:
void setBrand(const std::string& brand) {
m_brand = brand;
}
void setColor(const std::string& color) {
m_color = color;
}
void setModel(const std::string& model) {
m_model = model;
}
void display() const {
std::cout << "Car: " << m_brand << ", " << m_color << ", " << m_model << std::endl;
}
private:
std::string m_brand;
std::string m_color;
std::string m_model;
};
// 构造者接口
class CarBuilder {
public:
virtual void buildBrand() = 0;
virtual void buildColor() = 0;
virtual void buildModel() = 0;
virtual Car* getCar() = 0;
};
// 具体构造者:奔驰汽车构造者
class BenzBuilder : public CarBuilder {
public:
void buildBrand() override {
m_car->setBrand("Benz");
}
void buildColor() override {
m_car->setColor("Black");
}
void buildModel() override {
m_car->setModel("E-Class");
}
Car* getCar() override {
return m_car;
}
BenzBuilder() : m_car(new Car()) {}
private:
Car* m_car;
};
// 指挥者:负责构建汽车
class Director {
public:
Director(CarBuilder* builder) : m_builder(builder) {}
void buildCar() {
m_builder->buildBrand();
m_builder->buildColor();
m_builder->buildModel();
}
private:
CarBuilder* m_builder;
};
int main() {
// 创建奔驰汽车构造者
BenzBuilder benzBuilder;
// 创建指挥者
Director director(&benzBuilder);
// 构建汽车
director.buildCar();
// 获取构建好的汽车
Car* car = benzBuilder.getCar();
// 显示汽车信息
car->display();
delete car;
return 0;
}