C++ 建造者模式详解
建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象,使相同的构建过程可以创建不同的表示。
概念解析
建造者模式的核心思想是:
-
分离复杂对象的构建和表示:将对象的构建过程与其表示分离
-
分步构建:允许通过一系列步骤构建复杂对象
-
灵活配置:相同的构建过程可以创建不同的产品表示
主要组成部分
-
产品(Product):最终要构建的复杂对象
-
抽象建造者(Builder):定义创建产品各个部件的抽象接口
-
具体建造者(Concrete Builder):实现Builder接口,构造和装配产品的各个部件
-
指挥者(Director):构建使用Builder接口的对象,控制构建过程
-
客户端(Client):创建Director和Builder对象,并启动构建过程
代码示例
下面是一个完整的建造者模式示例,包含详细注释:
#include <iostream>
#include <string>
#include <vector>
#include <memory>// 产品类:汽车
class Car {
private:std::string engine_;std::string transmission_;std::vector<std::string> wheels_;std::vector<std::string> electronics_;public:void setEngine(const std::string& engine) {engine_ = engine;}void setTransmission(const std::string& transmission) {transmission_ = transmission;}void addWheel(const std::string& wheel) {wheels_.push_back(wheel);}void addElectronic(const std::string& electronic) {electronics_.push_back(electronic);}void showDetails() const {std::cout << "汽车配置详情:" << std::endl;std::cout << "发动机: " << engine_ << std::endl;std::cout << "变速箱: " << transmission_ << std::endl;std::cout << "车轮: ";for (const auto& wheel : wheels_) {std::cout << wheel << " ";}std::cout << std::endl;std::cout << "电子设备: ";for (const auto& electronic : electronics_) {std::cout << electronic << " ";}std::cout << std::endl;}
};// 抽象建造者
class CarBuilder {
public:virtual ~CarBuilder() = default;virtual void buildEngine() = 0;virtual void buildTransmission() = 0;virtual void buildWheels() = 0;virtual void buildElectronics() = 0;virtual std::unique_ptr<Car> getCar() = 0;
};// 具体建造者:经济型汽车建造者
class EconomyCarBuilder : public CarBuilder {
private:std::unique_ptr<Car> car_;public:EconomyCarBuilder() {car_ = std::make_unique<Car>();}void buildEngine() override {car_->setEngine("1.5L 自然吸气发动机");}void buildTransmission() override {car_->setTransmission("5速手动变速箱");}void buildWheels() override {for (int i = 0; i < 4; ++i) {car_->addWheel("15寸钢制轮毂");}}void buildElectronics() override {car_->addElectronic("基础音响系统");car_->addElectronic("手动空调");}std::unique_ptr<Car> getCar() override {return std::move(car_);}
};// 具体建造者:豪华型汽车建造者
class LuxuryCarBuilder : public CarBuilder {
private:std::unique_ptr<Car> car_;public:LuxuryCarBuilder() {car_ = std::make_unique<Car>();}void buildEngine() override {car_->setEngine("3.0L V6涡轮增压发动机");}void buildTransmission() override {car_->setTransmission("8速自动变速箱");}void buildWheels() override {for (int i = 0; i < 4; ++i) {car_->addWheel("19寸铝合金轮毂");}}void buildElectronics() override {car_->addElectronic("高级音响系统");car_->addElectronic("自动空调");car_->addElectronic("导航系统");car_->addElectronic("倒车影像");car_->addElectronic("自动驾驶辅助");}std::unique_ptr<Car> getCar() override {return std::move(car_);}
};// 指挥者
class CarManufacturer {
public:std::unique_ptr<Car> buildCar(CarBuilder& builder) {builder.buildEngine();builder.buildTransmission();builder.buildWheels();builder.buildElectronics();return builder.getCar();}
};// 客户端代码
int main() {std::cout << "=== 建造者模式演示 ===" << std::endl;CarManufacturer manufacturer;// 构建经济型汽车std::cout << "\n构建经济型汽车:" << std::endl;EconomyCarBuilder economyBuilder;auto economyCar = manufacturer.buildCar(economyBuilder);economyCar->showDetails();// 构建豪华型汽车std::cout << "\n构建豪华型汽车:" << std::endl;LuxuryCarBuilder luxuryBuilder;auto luxuryCar = manufacturer.buildCar(luxuryBuilder);luxuryCar->showDetails();return 0;
}
模式优势
-
分步构建:允许分步骤构建复杂对象,对构建过程有更精细的控制
-
隔离构建与表示:将对象的构建与其表示分离
-
灵活配置:相同的构建过程可以创建不同的产品表示
-
单一职责原则:将复杂构建代码从业务逻辑中分离出来
-
更好的控制:相比工厂模式,建造者模式能更好地控制构建过程
适用场景
-
当创建复杂对象的算法应该独立于该对象的组成部分及其装配方式时
-
当构造过程必须允许被构造的对象有不同的表示时
-
当需要创建的对象包含多个组成部分,且这些部分需要按照特定顺序或配置组装时
-
当对象的创建过程非常复杂,包含多个步骤或需要特定顺序时