设计模式8——建造者模式

建造者模式定义一个具体的物体,是各种属性的集合。要创建该物体时,可以构建一个构造器,该构造器包含特定的构造方式,但是只提供一个接口,具体构造细节放在派生类中实现。

Builder.h内容

复制代码
  1 #ifndef Builder_H_H
  2 #define Builder_H_H
  3 
  4 #include <iostream>
  5 #include <string>
  6 #include <vector>
  7 using namespace std;
  8 
  9 class Product
 10 {
 11 public:
 12     Product() {}
 13     void display(){
 14         //cout << vecStr.size() << endl;
 15         for(size_t i=0; i<vecStr.size(); ++i){
 16             cout << vecStr[i] << "  ";
 17         }
 18         cout << endl;
 19     }
 20     void addItem(string str) { vecStr.push_back(str); }
 21 private:
 22     vector<string> vecStr;
 23 };
 24 
 25 class Builder
 26 {
 27 public:
 28     Builder() {}
 29     virtual Product* getProduct() = 0;
 30     void Build(){
 31         buildItem1();
 32         buildItem2();
 33     }
 34     virtual void buildItem1() = 0;
 35     virtual void buildItem2() = 0;
 36     virtual ~Builder() {}
 37 };
 38 
 39 
 40 class BuilderOne : public Builder
 41 {
 42 public:
 43     BuilderOne() { product = new Product(); }
 44     virtual void buildItem1() { product->addItem("First"); }
 45     virtual void buildItem2() { product->addItem("Second"); }
 46     virtual Product* getProduct() { return product; }
 47     void release(){
 48         if(product != NULL){
 49             delete product;
 50             product = NULL;
 51         }
 52     }
 53     virtual ~BuilderOne() { release(); }
 54 private:
 55     Product *product;
 56 };
 57 
 58 class BuilderTwo : public Builder
 59 {
 60 public:
 61     BuilderTwo() { product = new Product(); }
 62     virtual void buildItem1() { product->addItem("A"); }
 63     virtual void buildItem2() { product->addItem("B"); }
 64     virtual Product* getProduct() { return product; }
 65     void release(){
 66         if(product != NULL){
 67             delete product;
 68             product = NULL;
 69         }
 70     }
 71     virtual ~BuilderTwo() { release(); }
 72 private:
 73     Product *product;
 74 };
 75 
 76 class Direct
 77 {
 78 public:
 79     Direct() : builder(NULL) {}
 80     void setBuilder(Builder *builder0){
 81         release();
 82         builder = builder0;
 83     }
 84     void Build(){
 85         builder->Build();
 86     }
 87     Product* getProduct() { return builder->getProduct(); }
 88     void release(){
 89         if(builder != NULL){
 90             delete builder;
 91             builder = NULL;
 92         }
 93     }
 94     ~Direct() { release(); }
 95 private:
 96     Builder *builder;
 97 };
 98 
 99 void BuilderTest()
100 {
101     Builder *builder1 = new BuilderOne();
102     Builder *builder2 = new BuilderTwo();
103     Direct *direct = new Direct();
104 
105     direct->setBuilder(builder1);
106     direct->Build();
107     direct->getProduct()->display();
108 
109     direct->setBuilder(builder2);
110     direct->Build();
111     direct->getProduct()->display();
112 
113     delete direct;
114 }
115 
116 #endif
复制代码

运行结果:

posted @   丛林小阁楼  阅读(182)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示