<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          C++ 建造者模式 - 組裝電腦

          共 8049字,需瀏覽 17分鐘

           ·

          2021-03-08 03:09


          建造者模式(Builder Pattern),旨在將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。



          1

          模式結(jié)構(gòu)


          UML 結(jié)構(gòu)圖:



          • Builder(抽象建造者):為創(chuàng)建一個產(chǎn)品對象的各個部件指定抽象接口。

          • ConcreteBuilder(具體建造者):實現(xiàn) Builder 的接口以構(gòu)造和裝配該產(chǎn)品的各個部件,定義并明確它所創(chuàng)建的表示,并提供一個檢索產(chǎn)品的接口。

          • Director(指揮者):構(gòu)造一個使用 Builder 接口的對象。

          • Product(產(chǎn)品):表示被構(gòu)造的復(fù)雜對象。ConcreteBuilder 創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。



          2

          優(yōu)缺點



          優(yōu)點:


          • 建造者獨立,易于擴(kuò)展

          • 便于控制細(xì)節(jié)風(fēng)險



          缺點:


          • 產(chǎn)品必須有共同點,范圍有限制

          • 如果內(nèi)部變化復(fù)雜,將會有很多的建造類



          3

          適用場景


          • 需要生成的對象具有復(fù)雜的內(nèi)部結(jié)構(gòu)

          • 需要生成的對象內(nèi)部屬性本身相互依賴



          4

          案例分析




          Lenovo For Those Who Do - 聯(lián)想



          聯(lián)想旗下有眾多系列的電腦,例如:ThinkPad、Yoga ...... 在科技創(chuàng)新的大潮下,產(chǎn)品層出不窮。電腦雖多,但結(jié)構(gòu)基本一致,都是由 CPU、主板、內(nèi)存、顯卡等組成。如果為每臺電腦都單獨設(shè)計一個組裝流程,管理的成本太高。這時,建造者模式就出現(xiàn)了,為所有系列指定一個統(tǒng)一的組裝流程,所有的電腦都按照這個流程來組裝。



          5

          代碼實現(xiàn)



          創(chuàng)建產(chǎn)品


          這里的產(chǎn)品是 Computer,包含了 CPU、主板、內(nèi)存、顯卡等信息。


          #ifndef PRODUCT_H
          #define PRODUCT_H

          #include <iostream>

          using namespace std;

          // 電腦
          class Computer
          {

          public:
              void SetCpu(string cpu) { m_strCpu = cpu;}
              void SetMainboard(string mainboard) { m_strMainboard = mainboard; }
              void SetRam(string ram) { m_strRam = ram; }
              void SetVideoCard(string videoCard) { m_strVideoCard = videoCard; }

              string GetCPU() return m_strCpu; }
              string GetMainboard()  return m_strMainboard; }
              string GetRam() return m_strRam; }
              string GetVideoCard() return m_strVideoCard; }

          private:
              string m_strCpu;  // CPU
              string m_strMainboard;  // 主板
              string m_strRam;  // 內(nèi)存
              string m_strVideoCard;  // 顯卡
          };

          #endif // PRODUCT_H



          創(chuàng)建抽象建造者


          電腦準(zhǔn)備好之后,就可以定義組裝流程了,由 Builder 來表示。


          #ifndef BUILDER_H
          #define BUILDER_H

          #include "product.h"

          // 建造者接口,組裝流程
          class IBuilder
          {

          public:
              virtual void BuildCpu() 0;  // 創(chuàng)建 CPU
              virtual void BuildMainboard() 0;  // 創(chuàng)建主板
              virtual void BuildRam() 0;  // 創(chuàng)建內(nèi)存
              virtual void BuildVideoCard() 0;  // 創(chuàng)建顯卡
              virtual Computer* GetResult() 0;  // 獲取建造后的產(chǎn)品
          };

          #endif // BUILDER_H



          創(chuàng)建具體建造者


          接下來,就是讓 ConcreteBuilder 就位。在這些組裝者中,可以指定每臺電腦要使用的具體部件。


          #ifndef CONCRETE_BULIDER_H
          #define CONCRETE_BULIDER_H

          #include "builder.h"

          // ThinkPad 系列
          class ThinkPadBuilder : public IBuilder
          {
          public:
              ThinkPadBuilder() { m_pComputer = new Computer(); }
              void BuildCpu() override { m_pComputer->SetCpu("i5-6200U"); }
              void BuildMainboard() override { m_pComputer->SetMainboard("Intel DH57DD"); }
              void BuildRam() override  { m_pComputer->SetRam("DDR4"); }
              void BuildVideoCard() override { m_pComputer->SetVideoCard("NVIDIA Geforce 920MX"); }
              Computer* GetResult() override return m_pComputer; }

          private:
              Computer *m_pComputer;
          };

          // Yoga 系列
          class YogaBuilder : public IBuilder
          {
          public:
              YogaBuilder() { m_pComputer = new Computer(); }
              void BuildCpu() override  { m_pComputer->SetCpu("i7-7500U"); }
              void BuildMainboard() override { m_pComputer->SetMainboard("Intel DP55KG"); }
              void BuildRam() override { m_pComputer->SetRam("DDR5"); }
              void BuildVideoCard() override { m_pComputer->SetVideoCard("NVIDIA GeForce 940MX"); }
              Computer* GetResult() override return m_pComputer; }

          private:
              Computer *m_pComputer;
          };

          #endif // CONCRETE_BULIDER_H



          創(chuàng)建指揮者


          聯(lián)想要生產(chǎn)電腦了,直接委派給組裝者,開干。


          #ifndef DIRECTOR_H
          #define DIRECTOR_H

          #include "builder.h"

          // 構(gòu)造指揮官
          class Direcror
          {

          public:
              void Create(IBuilder *builder) {
                  builder->BuildCpu();
                  builder->BuildMainboard();
                  builder->BuildRam();
                  builder->BuildVideoCard();
              }
          };

          #endif // DIRECTOR_H



          創(chuàng)建客戶端


          現(xiàn)在,一起來看看客戶端,創(chuàng)建任何產(chǎn)品都非常干凈。


          #include "concrete_bulider.h"
          #include "director.h"
          #include <string>

          #ifndef SAFE_DELETE
          #define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
          #endif

          int main()
          {
              Direcror *pDirecror = new Direcror();
              ThinkPadBuilder *pTPBuilder = new ThinkPadBuilder();
              YogaBuilder *pYogaBuilder = new YogaBuilder();

              // 組裝 ThinkPad、Yoga
              pDirecror->Create(pTPBuilder);
              pDirecror->Create(pYogaBuilder);

              // 獲取組裝后的電腦
              Computer *pThinkPadComputer = pTPBuilder->GetResult();
              Computer *pYogaComputer = pYogaBuilder->GetResult();

              // 測試輸出
              cout << "-----ThinkPad-----" << endl;
              cout << "CPU: " << pThinkPadComputer->GetCPU() << endl;
              cout << "Mainboard: " << pThinkPadComputer->GetMainboard() << endl;
              cout << "Ram: " << pThinkPadComputer->GetRam() << endl;
              cout << "VideoCard: " << pThinkPadComputer->GetVideoCard() << endl;

              cout << "-----Yoga-----" << endl;
              cout << "CPU: " << pYogaComputer->GetCPU() << endl;
              cout << "Mainboard: " << pYogaComputer->GetMainboard() << endl;
              cout << "Ram: " << pYogaComputer->GetRam() << endl;
              cout << "VideoCard: " << pYogaComputer->GetVideoCard() << endl;

              SAFE_DELETE(pThinkPadComputer);
              SAFE_DELETE(pYogaComputer);
              SAFE_DELETE(pTPBuilder);
              SAFE_DELETE(pYogaBuilder);
              SAFE_DELETE(pDirecror);

              getchar();

              return 0;
          }


          輸出如下:

          -----ThinkPad-----

          CPU: i5-6200U

          Mainboard: Intel DH57DD

          Ram: DDR4

          VideoCard: NVIDIA Geforce 920MX

          -----Yoga-----

          CPU: i7-7500U

          Mainboard: Intel DP55KG

          Ram: DDR5

          VideoCard: NVIDIA GeForce 940MX


          ·················· END ··················

          關(guān)注后回復(fù)「1024」,獲取海量學(xué)習(xí)資源

          瀏覽 27
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美日韩黄色网络 | 一区二区三区激情在线 | 免费日批的视频 | 亚洲无码视频免费看 | 美女自慰网址 |