• 3,建造者模式(Builder Pattern)


    Builder模式  是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

                                创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象- 关注对象创建的各部分的创建过程

       适用情况一个对象的构建比较复杂,将一个对象的构建(?)和对象的表示(?)进行分离。

    1) Builder:为创建产品各个部分,统一抽象接口。

    2) ConcreteBuilder:具体的创建产品的各个部分,部分A, 部分B,部分C。

    3) Director:构造一个使用Builder接口的对象。

    4) Product:表示被构造的复杂对象。

    ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

    创建者模式和工厂模式的区别

    Factory模式中:

    1、有一个抽象的工厂。

    2、实现一个具体的工厂---汽车工厂。

    3、工厂生产汽车A,得到汽车产品A。

    4、工厂生产汽车B,得到汽车产品B。 

    这样做,实现了购买者和生产线的隔离。强调的是结果

        

    Builder模式:

    1、引擎工厂生产引擎产品,得到汽车部件A。

    2、轮胎工厂生产轮子产品,得到汽车部件B。

    3、底盘工厂生产车身产品,得到汽车部件C。

    4、将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。

    5、将这个整体送到汽车组装工厂,得到一个汽车产品。

    这样做,目的是为了实现复杂对象生产线和其部件的解耦。强调的是过程

    两者的区别在于:

      Factory模式不考虑对象的组装过程,而直接生成一个我想要的对象。  Factory模式所解决的问题是,工厂生产产品。

           Builder模式先一个个的创建对象的每一个部件,再统一组装成一个对象。Builder模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品。

           Builder模式不是很常用。模式本身就是一种思想。知道了就可以了。              

           设计模式就是一种思想。学习一个模式,花上一两个小时把此模式的意思理解了,就 够了。其精华的所在会在以后工作的设计中逐渐体现出来。

      1 #include <iostream>
      2 using namespace std;
      3 
      4 #include "string"
      5 //房子 只有get set 接口 
      6 class House
      7 {
      8 public:
      9     void setDoor(string door)
     10     {
     11         this->m_door = door;
     12     }
     13 
     14     void setWall(string wall)
     15     {
     16         this->m_wall = wall;
     17     }
     18     void setWindow(string window)
     19     {
     20         this->m_window = window;
     21     }
     22 
     23     //--
     24     string getDoor( )
     25     {
     26         cout << m_door << endl;
     27         return this->m_door ;
     28     }
     29 
     30     string getWall()
     31     {
     32         cout << m_wall << endl;
     33         return this->m_wall;
     34     }
     35     string getWindow()
     36     {
     37         cout << m_window << endl;
     38         return m_window;
     39     }
     40 
     41 private:
     42     string    m_door;
     43     string    m_wall;
     44     string    m_window;
     45 };
     46 //工程队 虚父类 
     47 class  Builder
     48 {
     49 public:
     50     virtual void buildWall() = 0;
     51     virtual void buildDoor() = 0;
     52     virtual void buildWindow() = 0;
     53     virtual House* getHouse() = 0;
     54 };
     55 
     56 //公寓工程队
     57 class  FlatBuilder : public Builder
     58 {
     59 public:
     60     FlatBuilder()
     61     {
     62         m_house = new House;
     63     }
     64     virtual void buildWall()
     65     {
     66         m_house->setWall(" flat wall");
     67     }
     68 
     69     virtual void buildDoor()
     70     {
     71         m_house->setDoor("flat door");
     72     }
     73 
     74     virtual void buildWindow()
     75     {
     76         m_house->setWindow("flat window");
     77     }
     78 
     79     virtual House* getHouse()
     80     {
     81         return m_house;
     82     }
     83 private:
     84     House *m_house;
     85 };
     86 
     87 //别墅 villa 工程队
     88 class  VillaBuilder : public Builder
     89 {
     90 public:
     91     VillaBuilder()
     92     {
     93         m_house = new House;
     94     }
     95     virtual void buildWall()
     96     {
     97         m_house->setWall(" villa wall");
     98     }
     99 
    100     virtual void buildDoor()
    101     {
    102         m_house->setDoor("villa door");
    103     }
    104 
    105     virtual void buildWindow()
    106     {
    107         m_house->setWindow("villa window");
    108     }
    109 
    110     virtual House* getHouse()
    111     {
    112         return m_house;
    113     }
    114 private:
    115     House *m_house;
    116 };
    117 
    118 //设计师(指挥者) 负责建造逻辑  
    119 //建筑队 干具体的活
    120 class Director 
    121 {
    122 public:
    123     Director( Builder * build)
    124     {
    125         m_build = build;
    126     }
    127     void Construct()
    128     {
    129         m_build->buildWall();
    130         m_build->buildWindow();
    131         m_build->buildDoor();
    132     }
    133 private:
    134      Builder * m_build;
    135 };
    136 
    137 
    138 void main()
    139 {
    140     House        *house  = NULL;
    141     Builder        *builder = NULL;
    142     Director    *director = NULL;
    143 
    144     // 请一个建造别墅的工程队
    145     builder = new VillaBuilder;
    146 
    147     //设计师 指挥 工程队 干活
    148     director = new Director(builder);
    149     director->Construct(); 
    150     house  =  builder->getHouse();
    151     house->getWindow();
    152     house->getDoor();
    153 
    154     delete house;
    155     delete builder;
    156 
    157     //请 FlatBuilder 公寓
    158     builder = new FlatBuilder;
    159     director = new Director(builder);
    160     director->Construct(); 
    161     house  =  builder->getHouse();
    162     house->getWindow();
    163     house->getDoor();
    164     delete house;
    165     delete builder;
    166 
    167 
    168     delete director;
    169     system("pause");
    170     return ;
    171 }
  • 相关阅读:
    新手建站必看
    88.com域名邮箱免费注册了
    屏蔽博客园的广告
    跳过烦人的hCaptcha验证
    pap.er 专为 Mac 设计的壁纸应用
    TrafficMonitor
    利用CloudFlare自动DDNS
    P.SDA1.DEV
    谷歌浏览器又隐藏的HTTPS和WWW前缀
    谷歌浏览器扩展 crx 下载
  • 原文地址:https://www.cnblogs.com/D-DZDD/p/7338127.html
Copyright © 2020-2023  润新知