<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++ 簡單工廠模式 - BBA 造車了

          共 5296字,需瀏覽 11分鐘

           ·

          2021-03-17 22:36

          簡單工廠模式(Simple Factory Pattern)又叫做靜態(tài)工廠方法模式(Static Factory Method Pattern),屬于創(chuàng)建型模式。簡單工廠模式的實質(zhì)是由一個工廠類根據(jù)傳入的參數(shù),動態(tài)決定應(yīng)該創(chuàng)建哪一個產(chǎn)品類的實例。


          值得注意的是,簡單工廠模式并不屬于 23 種 GoF 設(shè)計模式之一。它是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現(xiàn)。



          1

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


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



          • 工廠(Factory):整個模式的核心,負責(zé)實現(xiàn)創(chuàng)建所有實例的內(nèi)部邏輯。

          • 抽象產(chǎn)品(Product):所有具體產(chǎn)品的父類,負責(zé)描述所有實例所共有的公共接口。

          • 具體產(chǎn)品(ConcreteProduct):最終創(chuàng)建的具體產(chǎn)品



          2

          優(yōu)缺點



          優(yōu)點:


          • 工廠類包含了必要的邏輯判斷,根據(jù)指定的信息來創(chuàng)建對應(yīng)的產(chǎn)品??蛻舳藘H負責(zé)“消費”產(chǎn)品即可,實現(xiàn)了對象創(chuàng)建和使用的分離。

          • 客戶端無需關(guān)心具體產(chǎn)品如何創(chuàng)建與組織,僅需知道具體產(chǎn)品所對應(yīng)的參數(shù)即可,可以在一定程度減少使用者的記憶量。



          缺點:


          • 由于工廠類集中了所有產(chǎn)品的創(chuàng)建邏輯(違反了高內(nèi)聚責(zé)任分配原則),職責(zé)過重,一旦無法正常工作,整個系統(tǒng)都將受到影響。

          • 一旦添加新產(chǎn)品就不得不修改工廠邏輯,在產(chǎn)品類型較多時,有可能造成工廠邏輯過于復(fù)雜,不利于系統(tǒng)的擴展和維護。


          這些缺點在"工廠方法模式"中得到了一定的克服。



          3

          適用場景


          • 工廠類負責(zé)創(chuàng)建的對象比較少(不會造成工廠方法中的業(yè)務(wù)邏輯太過復(fù)雜)。

          • 客戶端僅需知道傳入工廠類的參數(shù),對于如何創(chuàng)建對象(邏輯)不關(guān)心。


          注意:由于簡單工廠很容易違反高內(nèi)聚責(zé)任分配原則,因此一般只在很簡單的情況下應(yīng)用。



          4

          案例分析




          BBA - 奔馳、寶馬、奧迪





          互聯(lián)網(wǎng)行業(yè)有三巨頭 BAT,汽車界也有三大豪門 BBA。它們是馳名世界的汽車企業(yè),也被認為是高檔汽車生產(chǎn)的先導(dǎo),最可怕的是均屬于德國制造。奔馳優(yōu)雅穩(wěn)重、寶馬操控感強、奧迪大氣,更是官車的代表。。。“坐奔馳,開寶馬”,足以說明一切。


          在國內(nèi),BBA 大受歡迎,對很多人來說,不僅是代步工具,更是身份的象征。但車再好,也需要在工廠中加工生產(chǎn),來一起看看簡單工廠模式吧!



          5

          代碼實現(xiàn)



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


          汽車產(chǎn)品,由 ICar 表示:


          // product.h
          #ifndef PRODUCT_H
          #define PRODUCT_H

          #include <string>

          using namespace std;

          // 汽車接口
          class ICar
          {

          public:
              virtual string Name() 0;  // 汽車名稱
          };

          #endif // PRODUCT_H



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


          模型有了,就可以定義具體的汽車了,它們有不同的品牌:


          // concrete_product.h
          #ifndef CONCRETE_PRODUCT_H
          #define CONCRETE_PRODUCT_H

          #include "product.h"

          // 奔馳汽車
          class BenzCar : public ICar
          {
          public:
              string Name() override {
                  return "Benz Car";
              }
          };

          // 寶馬汽車
          class BmwCar : public ICar
          {
          public:
              string Name() override {
                  return "Bmw Car";
              }
          };

          // 奧迪汽車
          class AudiCar : public ICar
          {
          public:
              string Name() override {
                  return "Audi Car";
              }
          };

          #endif // CONCRETE_PRODUCT_H



          創(chuàng)建工廠


          要生產(chǎn)汽車,需要有相應(yīng)的工廠:


          // factory.h
          #ifndef FACTORY_H
          #define FACTORY_H

          #include "concrete_product.h"

          enum class CAR_TYPE {
              BENZ,  // 奔馳汽車
              BMW,   // 寶馬汽車
              AUDI   // 奧迪汽車
          };

          // 工廠
          class Factory
          {

          public:
              // 生產(chǎn)汽車
              ICar* CreateCar(CAR_TYPE type) {
                  ICar *pCar = nullptr;
                  switch(type) {
                  case CAR_TYPE::BENZ:
                      pCar = new BenzCar();  // 奔馳汽車
                      break;
                  case CAR_TYPE::BMW:
                      pCar = new BmwCar();  // 寶馬汽車
                      break;
                  case CAR_TYPE::AUDI:
                      pCar = new AudiCar();  // 奧迪汽車
                      break;
                  default:
                      break;
                  }
                  return pCar;
              }
          };

          #endif // FACTORY_H


          這樣以來,工廠就可以根據(jù)汽車類型來生產(chǎn)對應(yīng)的汽車了。



          創(chuàng)建客戶端


          當(dāng)一切準備就緒,就可以實現(xiàn)客戶端了:


          // main.cpp
          #include "factory.h"
          #include "product.h"
          #include <iostream>

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

          int main()
          {
              // 工廠
              Factory *pFactory = new Factory();

              // 生產(chǎn)奔馳、寶馬、奧迪
              ICar *pBenzCar = pFactory->CreateCar(CAR_TYPE::BENZ);
              ICar* pBmwCar = pFactory->CreateCar(CAR_TYPE::BMW);
              ICar* pAudiCar = pFactory->CreateCar(CAR_TYPE::AUDI);

              cout << pBenzCar->Name() << endl;
              cout << pBmwCar->Name() << endl;
              cout << pAudiCar->Name() << endl;

              SAFE_DELETE(pBenzCar);
              SAFE_DELETE(pBmwCar);
              SAFE_DELETE(pAudiCar);
              SAFE_DELETE(pFactory);

              getchar();

              return 0;
          }


          輸出如下:

          Benz Car

          Bmw Car

          Audi Car


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

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

          瀏覽 62
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  天天插插综合视频综合 | 台湾在线视频一区二 | 欧差XXX性受XYX性爽 | 天天干天天射天天舔 | av中文字|