<aside> 💡

建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

</aside>

结构图

image.png

Director类 来控制建造过程,由 Builder类 来返回具体产品

优点

应用场景

题目

https://kamacoder.com/problempage.php?pid=1084

#include <iostream>
#include <string>
using namespace std;

// Product类
class Bike{
public:
    string frame;
    string tires;
public:
    void show(){
        cout << frame << " Frame " << tires << " Tires" << endl;
    }
};

// Builder类
class Builder{
protected:
    Bike* bike;
public:
    virtual void buildFrame() = 0;
    virtual void buildTires() = 0;
    Bike* getResult(){
        return bike;
    };
};

// 具体建造者类
class MountainBikeBuilder: public Builder{
public:
    MountainBikeBuilder(){
        bike = new Bike();
    }
    ~MountainBikeBuilder(){
        delete bike;
    }

    void buildFrame() override {
        bike->frame = "Aluminum";
    }
    void buildTires() override {
        bike->tires = "Knobby";
    }
};

class RoadBikeBuilder: public Builder{
public:
    RoadBikeBuilder(){
        bike = new Bike();
    }
    ~RoadBikeBuilder(){
        delete bike;
    }

    void buildFrame() override {
        bike->frame = "Carbon";
    }
    void buildTires() override {
        bike->tires = "Slim";
    }
};

// Director类
class BuilderDirector{
public:
    void build(Builder* builder){
        builder->buildFrame();
        builder->buildTires();
    }
};

int main(){
    int n;
    cin >> n;

    string bikeType;
    for(int i = 0; i < n; ++i){
        cin >> bikeType;
        Builder* builder = nullptr;
        if(bikeType == "mountain"){
            builder = new MountainBikeBuilder();
        }else if(bikeType == "road"){
            builder = new RoadBikeBuilder();
        }

        BuilderDirector* builderDirector = new BuilderDirector();
        builderDirector->build(builder);

        Bike* bike = builder->getResult();
        bike->show();

        delete builder;
        delete builderDirector;
        delete bike;
    }

    return 0;
}