• c++设计模式之建造者模式


    建造者模式:
    结构:
    1.产品对象:一类产品的抽象,具体产品的建造应该在具体建造者中实现
    3.抽象建造者
    4.具体建造者:对于每种具体产品都应该有一个对应的建造者,其中应该有一个抽象产品对象成员变量
    5.装配者:建造者对各个零件单独建造,没有顺序,因此,需要早装配者中确定建造顺序

    优点:
    1.建造者独立,易扩展
    缺点:
    1.产品必须具有相同属性
    2.产品越多,需要的建造者类也就越多

    场景:
    手机有很多,小米,华为,三星,苹果,虽然名称不一样,但是内部结构基本差不多。这种场景就很适合使用建造者模式:

      1 //IBuilder.h
      2 #pragma once
      3 #include "Phone.h"
      4 class IBuilder
      5 {
      6 public:
      7     IBuilder();
      8     ~IBuilder();
      9 protected:
     10     Phone* phone_;
     11 public:
     12     virtual void build_camera() = 0;
     13     virtual void build_earphone() = 0;
     14     virtual void build_screen() = 0;
     15     virtual Phone* get_phone();
     16 };
     17 
     18 class XiaomiBuilder:public IBuilder
     19 {
     20 public:
     21     XiaomiBuilder();
     22     void build_camera();
     23     void build_earphone();
     24     void build_screen();
     25 };
     26 
     27 
     28 class HuaweiBuilder :public IBuilder
     29 {
     30 public:
     31     HuaweiBuilder();
     32     void build_camera();
     33     void build_earphone();
     34     void build_screen();
     35 };
     36 
     37 //IBuilder.cpp
     38 #include "pch.h"
     39 #include "IBuilder.h"
     40 
     41 
     42 IBuilder::IBuilder()
     43 {
     44 }
     45 
     46 
     47 IBuilder::~IBuilder()
     48 {
     49 }
     50 
     51 Phone* IBuilder::get_phone() 
     52 {
     53     return phone_;
     54 }
     55 
     56 XiaomiBuilder::XiaomiBuilder() 
     57 {
     58     phone_ = new Phone;
     59 }
     60 
     61 void XiaomiBuilder::build_camera() 
     62 {
     63     phone_->set_camera("xiaomi camera!!1");
     64 }
     65 
     66 void XiaomiBuilder::build_screen() 
     67 {
     68     phone_->set_screen("xiaomi screen!!!");
     69 }
     70 
     71 void XiaomiBuilder::build_earphone() 
     72 {
     73     phone_->set_earphone("xiaomi earphone!!!");
     74 }
     75 
     76 HuaweiBuilder::HuaweiBuilder()
     77 {
     78     phone_ = new Phone;
     79 }
     80 
     81 void HuaweiBuilder::build_camera()
     82 {
     83     phone_->set_camera("huawei camera!!1");
     84 }
     85 
     86 void HuaweiBuilder::build_screen()
     87 {
     88     phone_->set_screen("huawei screen!!!");
     89 }
     90 
     91 void HuaweiBuilder::build_earphone()
     92 {
     93     phone_->set_earphone("huawei earphone!!!");
     94 }
     95 
     96 //Assembler.h
     97 #pragma once
     98 #include "IBuilder.h"
     99 class Assembler
    100 {
    101 public:
    102     Assembler();
    103     ~Assembler();
    104     void create(IBuilder* builedr);
    105 };
    106 
    107 //Assembler.cpp
    108 #include "pch.h"
    109 #include "Assembler.h"
    110 
    111 
    112 Assembler::Assembler()
    113 {
    114 }
    115 
    116 
    117 Assembler::~Assembler()
    118 {
    119 }
    120 
    121 
    122 void Assembler::create(IBuilder* builedr) 
    123 {
    124     builedr->build_screen();
    125     builedr->build_earphone();
    126     builedr->build_camera();
    127 }
    128 
    129 //Phone.h
    130 #pragma once
    131 #include <iostream>
    132 #include <string.h>
    133 using namespace std;
    134 
    135 class Phone
    136 {
    137 public:
    138     Phone();
    139     ~Phone();
    140     void set_camera(string camera);
    141     void set_screen(string screen);
    142     void set_earphone(string earphone);
    143     void display_camera();
    144     void display_earphone();
    145     void display_screen();
    146 private:
    147     string camera_;
    148     string screen_;
    149     string earphone_;
    150 };
    151 
    152 //Phone.cpp
    153 #include "pch.h"
    154 #include "Phone.h"
    155 
    156 
    157 Phone::Phone()
    158 {
    159 }
    160 
    161 
    162 Phone::~Phone()
    163 {
    164 }
    165 
    166 void Phone::set_camera(string camera) 
    167 {
    168     camera_ = camera;
    169 }
    170 
    171 void Phone::set_earphone(string earphone) 
    172 {
    173     earphone_ = earphone;
    174 }
    175 
    176 void Phone::set_screen(string screen) 
    177 {
    178     screen_ = screen;
    179 }
    180 
    181 void Phone::display_camera() 
    182 {
    183     cout << camera_.c_str() << endl;
    184 }
    185 
    186 void Phone::display_earphone() 
    187 {
    188     cout << earphone_.c_str() << endl;
    189 }
    190 
    191 void Phone::display_screen() 
    192 {
    193     cout << screen_.c_str() << endl;
    194 }
    195 
    196 //main.cpp
    197 #include "Phone.h"
    198 #include "IBuilder.h"
    199 using namespace std;
    200 
    201 #ifndef SAFE_DELETE
    202 #define  SAFE_DELETE(p){if(p){delete (p);(p)=NULL;}}
    203 #endif
    204 
    205 
    206 int main()
    207 { 
    208     IBuilder* xiaomi = new XiaomiBuilder;
    209     IBuilder* huawei = new HuaweiBuilder;
    210     Assembler* assembler = new Assembler;
    211     assembler->create(xiaomi);
    212     assembler->create(huawei);
    213 
    214     Phone* xiaomi_phone = xiaomi->get_phone();
    215     Phone* huawei_phone = huawei->get_phone();
    216 
    217     xiaomi_phone->display_camera();
    218     xiaomi_phone->display_earphone();
    219     xiaomi_phone->display_screen();
    220 
    221     huawei_phone->display_camera();
    222     huawei_phone->display_earphone();
    223     huawei_phone->display_screen();
    224 
    225 
    226     SAFE_DELETE(xiaomi);
    227     SAFE_DELETE(xiaomi_phone);
    228     SAFE_DELETE(huawei);
    229     SAFE_DELETE(huawei_phone);
    230     SAFE_DELETE(assembler);
    231 
    232     getchar();
    233 }

    //运行结果

  • 相关阅读:
    Alice and Bob 要用到辗转相减
    Java经典设计模式
    设计模式---创建类---建造者模式
    luogu4267 TamingtheHerd (dp)
    nowcoder172C 保护 (倍增lca+dfs序+主席树)
    nowcoder172A 中位数 (二分答案)
    bzoj4985 评分 (二分答案+dp)
    luogu4269 Snow Boots G (并查集)
    luogu4268 Directory Traversal (dfs)
    bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)
  • 原文地址:https://www.cnblogs.com/HPAHPA/p/10285425.html
Copyright © 2020-2023  润新知