C++计划模式之构造器

[复制链接]
发表于 2025-12-18 10:57:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
动机

在软件体系中,偶然候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用肯定的算法构成;由于需求的厘革,这个复杂对象的各个部分常常面临着剧烈的厘革,但是将它们组合在一起的算法却相对稳固。
怎样应对这种厘革?怎样提供一种“封装机制”来隔离出“复杂对象的各个部分”的厘革,从而保持体系中的“稳固构建算法”不随着需求改变而改变?
代码示例:创建各种房子,好比砖瓦房,高楼,别墅等房子
  1. class House{
  2.     //....
  3. };
  4. class HouseBuilder {
  5. public:
  6.     House* GetResult(){
  7.         return pHouse;
  8.     }
  9.     virtual ~HouseBuilder(){}
  10. protected:
  11.    
  12.     House* pHouse;
  13.         virtual void BuildPart1()=0;
  14.     virtual void BuildPart2()=0;
  15.     virtual void BuildPart3()=0;
  16.     virtual void BuildPart4()=0;
  17.     virtual void BuildPart5()=0;
  18.        
  19. };
  20. class StoneHouse: public House{
  21.    
  22. };
  23. // 石头房子的创建,override HouseBuilder里面的流程
  24. class StoneHouseBuilder: public HouseBuilder{
  25. protected:
  26.    
  27.     virtual void BuildPart1(){
  28.         //pHouse->Part1 = ...;
  29.     }
  30.     virtual void BuildPart2(){
  31.         
  32.     }
  33.     virtual void BuildPart3(){
  34.         
  35.     }
  36.     virtual void BuildPart4(){
  37.         
  38.     }
  39.     virtual void BuildPart5(){
  40.         
  41.     }
  42.    
  43. };
  44. // 房子具体构建过程
  45. class HouseDirector{
  46.    
  47. public:
  48.     // 有一个HouseBuilder的指针
  49.     HouseBuilder* pHouseBuilder;
  50.    
  51.     HouseDirector(HouseBuilder* pHouseBuilder){
  52.         this->pHouseBuilder=pHouseBuilder;
  53.     }
  54.    
  55.     House* Construct(){ // 整个构建流程是稳定的
  56.         
  57.         pHouseBuilder->BuildPart1();
  58.         
  59.         for (int i = 0; i < 4; i++){
  60.             pHouseBuilder->BuildPart2();
  61.         }
  62.         
  63.         bool flag=pHouseBuilder->BuildPart3();
  64.         
  65.         if(flag){
  66.             pHouseBuilder->BuildPart4();
  67.         }
  68.         
  69.         pHouseBuilder->BuildPart5();
  70.         
  71.         return pHouseBuilder->GetResult();
  72.     }
  73. };
  74. int main() {
  75.     // 创建石头房子的建造者
  76.     StoneHouseBuilder stoneHouseBuilder;
  77.     // 创建房子Director,并指定建造者
  78.     HouseDirector houseDirector(&stoneHouseBuilder);
  79.     // 构建房子
  80.     House* stoneHouse = houseDirector.Construct();
  81.     // 输出结果
  82.     if (stoneHouse != nullptr) {
  83.         // 假设 House 类有适当的输出方法
  84.         // 这里只是简单示例,实际使用时需要根据具体类的实现调用相应的方法
  85.         std::cout << "Stone House constructed." << std::endl;
  86.     } else {
  87.         std::cout << "Failed to construct Stone House." << std::endl;
  88.     }
  89.     // 释放资源
  90.     delete stoneHouse;
  91.     return 0;
  92. }
复制代码
上述代码涉及了Builder计划模式,包罗以下几个类:
House 类:
表现待构建的产物,即房子。在示例中,StoneHouse 类是 House 的详细实现。
HouseBuilder 抽象类:
界说了构建产物(房子)的抽象接口。详细的制作者(比方 StoneHouseBuilder)须要继续这个抽象类并实现接口中的方法,以完成详细产物的构建。
StoneHouseBuilder 类:
是HouseBuilder的详细实现,负责构建石头房子。它通过实现抽象接口中的方法来完成详细的制作流程。
HouseDirector 类:
起到引导制作的作用,通过构造函数吸收一个详细的制作者对象。通过调用制作者的方法,按照肯定的构建流程构造制作者完成产物的构建。
main 函数:
在 main 函数中,创建了 StoneHouseBuilder 的实例,然后创建了一个HouseDirector的实例,并将制作者转达给导演。通过导演的 Construct 方法,按照肯定的构建流程构建了石头房子,并输出结果。
总体而言,Builder计划模式的目的是将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建差别的表现。在这个示例中,HouseBuilder 抽象类界说了构建房子的接口,StoneHouseBuilder 实现了详细的石头房子构建流程,而 HouseDirector 则负责和谐制作者完成整个构建流程。
Builder要点总结
Builder 模式紧张用于“分步调构建一个复杂的对象”。在这此中“分步调”是一个稳固的算法,而复杂对象的各个部分则常常厘革。
厘革点在那边,封装那边—— Builder模式紧张在于应对“复杂对象各个部分”的频仍需求变更。其缺点在于难以应对“分步调构建算法”的需求变更。
在Builder模式中,要留意差别语言中构造器内调用虚函数的差别(C++ vs. C#) 。
chatGPT给出的builder的例子
以下是一个简单的C++示例代码,演示Builder计划模式:
  1. #include <iostream>
  2. #include <string>
  3. // 产品类
  4. class Product {
  5. public:
  6.     void AddPart(const std::string& part) {
  7.         parts += part + " ";
  8.     }
  9.     void Show() const {
  10.         std::cout << "Product Parts: " << parts << std::endl;
  11.     }
  12. private:
  13.     std::string parts;
  14. };
  15. // 抽象建造者类
  16. class Builder {
  17. public:
  18.     virtual void BuildPart1() = 0;
  19.     virtual void BuildPart2() = 0;
  20.     virtual Product* GetResult() = 0;
  21. };
  22. // 具体建造者类
  23. class ConcreteBuilder : public Builder {
  24. public:
  25.     ConcreteBuilder() {
  26.         product = new Product();
  27.     }
  28.     void BuildPart1() override {
  29.         product->AddPart("Part1");
  30.     }
  31.     void BuildPart2() override {
  32.         product->AddPart("Part2");
  33.     }
  34.     Product* GetResult() override {
  35.         return product;
  36.     }
  37. private:
  38.     Product* product;
  39. };
  40. // 指导者类
  41. class Director {
  42. public:
  43.     Director(Builder* builder) : builder(builder) {}
  44.     void Construct() {
  45.         builder->BuildPart1();
  46.         builder->BuildPart2();
  47.     }
  48. private:
  49.     Builder* builder;
  50. };
  51. int main() {
  52.     // 创建具体建造者
  53.     ConcreteBuilder concreteBuilder;
  54.     // 创建指导者,并传入具体建造者
  55.     Director director(&concreteBuilder);
  56.     // 指导者构建产品
  57.     director.Construct();
  58.     // 获取最终产品
  59.     Product* product = concreteBuilder.GetResult();
  60.     // 展示产品
  61.     if (product != nullptr) {
  62.         product->Show();
  63.         delete product;
  64.     }
  65.     return 0;
  66. }
复制代码
在这个示例中,Product 表现终极构建的复杂对象,Builder 是抽象制作者类,ConcreteBuilder 是详细制作者类,Director 是引导者类。通过引导者调用详细制作者的方法,终极得到构建完成的产物。这个例子中的产物是简单的包罗两个部分的字符串,现实应用中可以根据需求界说更复杂的产物布局。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表