定义
建造者模式(Builder Pattern)是一种创建型设计模式,它通过将一个复杂对象的构建过程分离出来,使得相同的构建过程可以创建不同的表示。建造者模式特别适合于需要生成的对象具有复杂结构,且各部分存在多种配置的方法。
结构
-
Builder(抽象建造者) :定义构建产品的抽象接口,规定了创建产品各个部分的方法。
-
ConcreteBuilder(具体建造者) :实现 Builder 接口,具体实现各个部分的创建方法,并最终返回一个产品实例。
-
Director(指挥者) :负责安排具体建造者的构建步骤,指挥构建过程。
-
Product(产品) :表示被构建的复杂对象。
代码示例
#include <iostream>
#include <string>
// 产品类:汽车
class Car
{
public:
std::string engine;
std::string wheels;
std::string body;
void show() {
std::cout << "Car with " << engine << ", " << wheels << ", " << body << std::endl;
}
};
// 抽象建造者
class CarBuilder
{
public:
virtual void buildEngine() = 0;
virtual void buildWheels() = 0;
virtual void buildBody() = 0;
virtual Car* getCar() = 0;
virtual ~CarBuilder() = default;
};
// 具体建造者1:运动型汽车类
class SportCarBuilder :public CarBuilder
{
private:
Car* car;
public:
SportCarBuilder()
{
car = new Car();
}
void buildEngine() override
{
car->engine = "V8 Engine";
}
void buildWheels() override
{
car->wheels = "18 inch Alloy Wheels";
}
void buildBody() override
{
car->body = "Sleek Sports Body";
}
Car* getCar() override
{
return car;
}
};
// 具体建造者2:家用汽车类
class FamilyCarBuilder : public CarBuilder {
private:
Car* car;
public:
FamilyCarBuilder()
{
car = new Car();
}
void buildEngine() override
{
car->engine = "V6 Engine";
}
void buildWheels() override
{
car->wheels = "16 inch Steel Wheels";
}
void buildBody() override
{
car->body = "Spacious Family Body";
}
Car* getCar() override
{
return car;
}
};
// 指挥者
class Director
{
private:
CarBuilder* builder;
public:
void setBuilder(CarBuilder* builder)
{
this->builder = builder;
}
Car* construct()
{
builder->buildEngine();
builder->buildWheels();
builder->buildBody();
return builder->getCar();
}
};
int main()
{
Director director;
// 建造运动型汽车
SportCarBuilder scb;
director.setBuilder(&scb);
Car* sportCar = director.construct();
sportCar->show();
delete sportCar;
// 建造家用型汽车
FamilyCarBuilder fcb;
director.setBuilder(&fcb);
Car* familyCar = director.construct();
familyCar->show();
delete familyCar;
system("pause");
return 0;
}
-
Car是产品类,表示被构建的复杂对象。 -
CarBuilder是抽象建造者,定义了构建产品的方法接口。 -
SportsCarBuilder是具体建造者,实现了构建产品的具体方法。 -
Director是指挥者,负责安排构建步骤。 -
客户端通过
Director来构建产品对象。
通过添加不同的具体建造者,我们可以灵活地构建不同类型的产品,同时保持客户端代码的简洁和可维护性。