汕头网站推广,网上如何推广自己的产品,织梦企业黄页网站源码,网站及微信建设是否涉及知识产权目的生成器模式又称建造者模式是一种创建型设计模式#xff0c; 能够分步骤创建复杂对象。 该模式允许使用相同的创建代码生成不同类型和形式的对象。生成器模式所构建的对象一定是庞大而复杂的对象#xff0c;类似与建造房屋#xff1a;按照既定工序进行建造。区别于工厂模…目的生成器模式又称建造者模式是一种创建型设计模式 能够分步骤创建复杂对象。 该模式允许使用相同的创建代码生成不同类型和形式的对象。生成器模式所构建的对象一定是庞大而复杂的对象类似与建造房屋按照既定工序进行建造。区别于工厂模式生成器模式的目的是把繁琐的构建过程从不同对象抽离使其脱离产品类或者工厂类实现一套标准的制造工序能够产出不同产品的效果。最后可以进一步将用于创建产品的一系列生成器步骤调用抽取成为单独的主管类。 主管类可定义创建步骤的执行顺序 而生成器则提供这些步骤的实现。实现方式构建过程拆分清晰地定义通用步骤 确保它们可以制造所有形式的产品。 声明生成器接口在基本生成器接口中声明这些步骤即声明各方法。定义生成器类为每个形式的产品创建具体生成器类 并实现其构造步骤。考虑创建主管类。 它可以使用同一生成器对象来封装多种构造产品的方式。客户端使用客户端代码会同时创建生成器和主管对象。 构造开始前 客户端必须将生成器对象传递给主管对象类似注入。 通常情况下 客户端只需调用主管类构造函数一次即可。 主管类使用生成器对象完成后续所有制造任务。 还有另一种方式 那就是客户端可以将生成器对象直接传递给主管类的制造方法。只有在所有产品都遵循相同接口的情况下 构造结果可以直接通过主管类获取。 否则 客户端应当通过生成器获取构造结果。代码实现如下
#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_ptrHouse getHouse() 0;
};// concorete builder: wood house
class WoodHouseBuilder : public HouseBuilder {
private:std::unique_ptrHouse house;public:WoodHouseBuilder() : house(std::make_uniqueHouse()) {}void buildFoundation() override {house-foundation Wooden Piles;}void buildStructure() override {house-structure Wooden Walls;}void buildRoof() override {house-roof Wooden Shingles;}std::unique_ptrHouse getHouse() override {return std::move(house);}
};// concorete builder: stone house
class StoneHouseBuilder : public HouseBuilder {
private:std::unique_ptrHouse house;public:StoneHouseBuilder() : house(std::make_uniqueHouse()) {}void buildFoundation() override {house-foundation Concrete Base;}void buildStructure() override {house-structure Stone Walls;}void buildRoof() override {house-roof Slate Tiles;}std::unique_ptrHouse 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_ptrHouse woodHouse woodBuilder.getHouse();std::cout Wood House:\n;woodHouse-show();StoneHouseBuilder stoneBuilder;director.construct(stoneBuilder);std::unique_ptrHouse stoneHouse stoneBuilder.getHouse();std::cout \nStone House:\n;stoneHouse-show();return 0;
}