五,设计模式-生成器/建造者模式

目的

生成器模式又称建造者模式是一种创建型设计模式, 能够分步骤创建复杂对象。 该模式允许使用相同的创建代码生成不同类型和形式的对象。

生成器模式所构建的对象一定是庞大而复杂的对象,类似与建造房屋:按照既定工序进行建造。区别于工厂模式,生成器模式的目的是把繁琐的构建过程从不同对象抽离,使其脱离产品类或者工厂类,实现一套标准的制造工序能够产出不同产品的效果。

最后,可以进一步将用于创建产品的一系列生成器步骤调用抽取成为单独的主管类。 主管类可定义创建步骤的执行顺序, 而生成器则提供这些步骤的实现。

实现方式

  1. 构建过程拆分:清晰地定义通用步骤, 确保它们可以制造所有形式的产品。

  2. 声明生成器接口:在基本生成器接口中声明这些步骤,即声明各方法。

  3. 定义生成器类:为每个形式的产品创建具体生成器类, 并实现其构造步骤。

  4. 考虑创建主管类。 它可以使用同一生成器对象来封装多种构造产品的方式。

  5. 客户端使用:客户端代码会同时创建生成器和主管对象。 构造开始前, 客户端必须将生成器对象传递给主管对象(类似注入)。 通常情况下, 客户端只需调用主管类构造函数一次即可。 主管类使用生成器对象完成后续所有制造任务。 还有另一种方式, 那就是客户端可以将生成器对象直接传递给主管类的制造方法。

  6. 只有在所有产品都遵循相同接口的情况下, 构造结果可以直接通过主管类获取。 否则, 客户端应当通过生成器获取构造结果。

代码实现如下:

cpp 复制代码
#include <iostream>
#include <memory>
#include <string>

// Product
class House {
public:
    std::string foundation;
    std::string structure;
    std::string roof;

    void show() const {
        std::cout << "Foundation: " << foundation << "\n"
                  << "Structure: " << structure << "\n"
                  << "Roof: " << roof << std::endl;
    }
};

// abstract builder class-interface as c#
class HouseBuilder {
public:
    virtual ~HouseBuilder() = default;
    virtual void buildFoundation() = 0;
    virtual void buildStructure() = 0;
    virtual void buildRoof() = 0;
    virtual std::unique_ptr<House> getHouse() = 0;
};

// concorete builder: wood house
class WoodHouseBuilder : public HouseBuilder {
private:
    std::unique_ptr<House> house;

public:
    WoodHouseBuilder() : house(std::make_unique<House>()) {}

    void buildFoundation() override {
        house->foundation = "Wooden Piles";
    }

    void buildStructure() override {
        house->structure = "Wooden Walls";
    }

    void buildRoof() override {
        house->roof = "Wooden Shingles";
    }

    std::unique_ptr<House> getHouse() override {
        return std::move(house);
    }
};

// concorete builder: stone house
class StoneHouseBuilder : public HouseBuilder {
private:
    std::unique_ptr<House> house;

public:
    StoneHouseBuilder() : house(std::make_unique<House>()) {}

    void buildFoundation() override {
        house->foundation = "Concrete Base";
    }

    void buildStructure() override {
        house->structure = "Stone Walls";
    }

    void buildRoof() override {
        house->roof = "Slate Tiles";
    }

    std::unique_ptr<House> getHouse() override {
        return std::move(house);
    }
};

// director
class HouseDirector {
public:
    void construct(HouseBuilder& builder) {
        builder.buildFoundation();
        builder.buildStructure();
        builder.buildRoof();
    }
};

// client
int main() {
    HouseDirector director;

    WoodHouseBuilder woodBuilder;
    director.construct(woodBuilder);
    std::unique_ptr<House> woodHouse = woodBuilder.getHouse();
    std::cout << "Wood House:\n";
    woodHouse->show();

    StoneHouseBuilder stoneBuilder;
    director.construct(stoneBuilder);
    std::unique_ptr<House> stoneHouse = stoneBuilder.getHouse();
    std::cout << "\nStone House:\n";
    stoneHouse->show();

    return 0;
}
相关推荐
da_vinci_x5 小时前
告别手动“拼图”:AI+自动化游戏UI雪碧图(Sprite Sheet)工作流
人工智能·游戏·设计模式·prompt·aigc·技术美术·游戏美术
想睡hhh6 小时前
网络实践——基于epoll_ET工作、Reactor设计模式的HTTP服务
网络·http·设计模式·reactor·epoll
徐小夕@趣谈前端13 小时前
如何实现多人协同文档编辑器
javascript·vue.js·设计模式·前端框架·开源·编辑器·github
new_daimond20 小时前
设计模式-访问者模式详解
设计模式·访问者模式
大飞pkz20 小时前
【设计模式】组合模式
开发语言·设计模式·c#·组合模式
不搞学术柒柒20 小时前
设计模式-结构性设计模式(针对类与对象的组织结构)
设计模式
Asort20 小时前
JavaScript设计模式(四)——建造者模式:优雅构建复杂对象的实用指南
前端·javascript·设计模式
星空寻流年21 小时前
设计模式第四章(组合模式)
设计模式·组合模式
笨手笨脚の21 小时前
设计模式-组合模式
设计模式·组合模式·结构型设计模式·设计模式之美