zoukankan      html  css  js  c++  java
  • 设计模式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

    运行结果:

  • 相关阅读:
    Linux rsync 命令详解
    docker 容器间网络配置
    git合并分支
    基于Docker的Mysql主从复制搭建
    MySQL字符串函数substring:字符串截取
    mysql 存储过程
    分布式系统唯一ID生成方案汇总 转
    mysql 比较函数和操作符
    Distributed PostgreSQL on a Google Spanner Architecture – Storage Layer
    Distributed PostgreSQL on a Google Spanner Architecture – Query Layer
  • 原文地址:https://www.cnblogs.com/MiniHouse/p/3975822.html
Copyright © 2011-2022 走看看