Builder模式

    科技2022-07-10  139

    文章目录

    背景定义与模板方法的异同同异总结 case

    未经授权,禁止转载!创作不易,尊重原创!~~

    背景

    在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。 如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求的改变而改变?

    定义

    将一个复杂对象的构建与其表示想分离,使得同样的构建过程(稳定)可以创建不同的表示。 --《设计模式》 GoF

    与模板方法的异同

    模板方法解决的问题是一致的:都是有固定的流程(建房子),但实现细节不一样。

    Builder模式侧重将对象本身与对象的构建分开。

    总结

    没有明显的边界,不好区分异同。

    case

    和模板方法类似的例子,现在有很多游戏,让用户变成一名建筑师,建造自己的房子。虽然用户可以设计各种各样的房子,但总体流程是不变的,买材料,建房子(垒墙,装门,装窗户啊,盖房顶等等等),建房子可以建不同风格的,小砖房,小洋楼,等等。

    // build.h #include<iostream> class House { public: House() {} ~House() {} virtual std::string name() = 0; public: std::string wall_; std::string door_; std::string windows_; }; class HouseBuilder { public: HouseBuilder(House* house) : house_(house) {} ~HouseBuilder() {} virtual void BuildWall() = 0; virtual void BuildDoor() = 0; virtual void BuildWindows() = 0; protected: House* house_; }; class WoodHouse : public House { public: std::string name() {return "wood_house";} }; class WoodHouseBuilder : public HouseBuilder { public: WoodHouseBuilder(WoodHouse* house) : HouseBuilder(house) {} ~WoodHouseBuilder() {} virtual void BuildWall() { house_->wall_ = "wooden_wall"; } virtual void BuildDoor() { house_->door_ = "wooden_door"; } virtual void BuildWindows() { house_->windows_ = "wooden_windows"; } }; class BuildDirector { private: HouseBuilder* house_builder_; public: BuildDirector(HouseBuilder* house_builder): house_builder_(house_builder) {} void BuildYourHouse() { house_builder_->BuildWall(); house_builder_->BuildDoor(); house_builder_->BuildWindows(); } }; //main.cc #include<iostream> #include "build.h" int main() { WoodHouse wooden_house; WoodHouseBuilder wh_builder(&wooden_house); BuildDirector bd(&wh_builder); bd.BuildYourHouse(); return 0; }
    Processed: 0.009, SQL: 8