建造者模式(Builder Pattern)是一种创建型设计模式,旨在分步骤创建一个复杂对象,并可以通过不同的配置来获得不同表现的对象。与其他对象创建模式不同,建造者模式更加关注于对象创建的过程。
核心思想:建造者模式将对象的构建过程与最终表示分离,使同样的构建过程可以创建不同的表示。它通常实现为一个构建器类,提供一系列的方法用于配置对象的不同部分,然后通过一个“指导者”(Director)类协调这些方法的调用顺序,以构建最终对象。
组成部分
-
产品(Product):最终创建的复杂对象。
-
建造者(Builder):抽象接口,定义创建产品各部分的方法。
-
具体建造者(ConcreteBuilder):实现
Builder接口,进行具体的部件构造,最后返回完整的产品。 -
指导者(Director):使用
Builder的方法定义构建产品的顺序。
#include <iostream>
#include <string>
// 产品类,代表一个复杂对象
class Product {
public:
void setPartA(const std::string& part) { partA = part; }
void setPartB(const std::string& part) { partB = part; }
void setPartC(const std::string& part) { partC = part; }
void showProduct() {
std::cout << "Product Parts: " << partA << ", " << partB << ", " << partC << std::endl;
}
private:
std::string partA;
std::string partB;
std::string partC;
};
// 抽象建造者接口
class Builder {
public:
virtual ~Builder() = default;
virtual void buildPartA() = 0;
virtual void buildPartB() = 0;
virtual void buildPartC() = 0;
virtual Product getProduct() = 0;
};
// 具体建造者
class ConcreteBuilder : public Builder {
public:
ConcreteBuilder() { reset(); }
void buildPartA() override { product.setPartA("Part A1"); }
void buildPartB() override { product.setPartB("Part B1"); }
void buildPartC() override { product.setPartC("Part C1"); }
Product getProduct() override {
Product p = product;
reset();
return p;
}
private:
void reset() { product = Product(); }
Product product;
};
// 指导者类
class Director {
public:
void setBuilder(Builder* builder) { this->builder = builder; }
// 定义创建对象的具体步骤
void buildMinimalViableProduct() {
builder->buildPartA();
}
void buildFullFeaturedProduct() {
builder->buildPartA();
builder->buildPartB();
builder->buildPartC();
}
private:
Builder* builder;
};
int main() {
Director director;
ConcreteBuilder builder;
director.setBuilder(&builder);
director.buildMinimalViableProduct();
Product product1 = builder.getProduct();
product1.showProduct();
director.buildFullFeaturedProduct();
Product product2 = builder.getProduct();
product2.showProduct();
return 0;
}
特点和优点
-
分步骤创建:可以按顺序逐步构建复杂对象,而不需要知道组成该对象的细节。
-
灵活性:允许产品的部分是可替换的,可以容易地创建不同的表示。
-
可读性增强:由于构建逻辑是分开的(通过 builder 而非复杂的构造函数),代码更加易读。
使用场景
-
需要生成复杂对象:如果对象需要许多步骤或者可以有不同表示。
-
需要创建组合对象:例如 GUI 界面,部件设置可能需要顺序可调整。
-
不希望使用复杂构造器:避免直接使用复杂的构造函数,或者需要可变初始化参数集的应用。
建造者模式非常适合创建复杂对象时使用,特别是当对象的某些部分是可选的或变量初始化过程较复杂的情况下。通过结构化建造过程,增强代码的可读性和可维护性。
1234

被折叠的 条评论
为什么被折叠?



