<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C++簡單工廠模式的學習

      我們先從最常見的C++類的一個實現開始說起,

      class API
      {
      public:
      virtual test(std::string s)=0;
      protected:
      API(){};
      };
      class ImpleOne :public API {
      public:
          void test(string s) override {
              std::cout << "現在是One在執行 " << s<<std::endl;
          }
      };
      
      int main(void)
      {
      API * pApi=new ImpleOne();
      pApi->test();
      return;
      }

      這樣的代碼就會破壞我們面向對象的封裝性,因為調用者會知道API和IMPLEONE的存在。

      怎么樣完成高內聚,低耦合這個要求那?

      那就用一下我們的簡單工廠模式,在頭文件中

      #include<iostream>
      #include<string>
      #include<map>
      //建立函數指針 
      typedef void* (*Constructor)();
      
      //創建一個工廠.
      class CObjectFactory
      {
      public:
          //注冊對應的類添加到容器中
          static void RegsiterClass(std::string classname, Constructor constructor)
          {
              constructors()[classname] = constructor;
          }
          //創建一個類的對象并返回
          static void* CreateObject(const std::string ClassName)
          {
              Constructor constructor = nullptr;
              if (constructors().find(ClassName) != constructors().end())
              {
                  constructor = constructors().find(ClassName)->second;
              }
              if (constructor == nullptr)
              {
                  return nullptr;
              }
              return (*constructor)();
          }
      private:
          //返回一個容器
          static std::map<std::string, Constructor>& constructors()
          {
              static std::map<std::string, Constructor> instance;
              return instance;
          }
      
      };
      
      //注冊我們的類的宏定義
      #define REG_CLASS(class_name) \
       class class_name##Helper{ \
       public:  \
          class_name##Helper(){ \
          CObjectFactory::RegsiterClass(#class_name,class_name##Helper::CreateObjFunc); \
          }; \
          static  void*CreateObjFunc() \
          { \
              return new class_name; \
          } \
       };\
       static class_name##Helper class_name##helper; //加入static是指只在頭文件中有效。

      然后就是如何調用這個簡單工廠

       //在這里可以通過讀取配置文件,或者直接修改REG_CLASS和CreateObject中的字符串,就可以完成對這個類的改變,或者更新 ,并不影響后面代碼的更改。
       REG_CLASS(ImpleOne)
       class AUTOFACTORY
       {
           public:
           std::shared_ptr<Api> CreateAPI()
           {
              
              std::shared_ptr<API> Apipointer(static_cast<API*>(CObjectFactory::CreateObject("ImpleOne")));
              return Apipointer;
           }
       }
       int main(void)
       {
          std::shared_ptr<Api> testpoint(AUTOFACTORY::CreateAPI());
          testpoint->test("我不是你爸爸!");
          return;
       }

      總結一下:我們可以通過創建一個類作為工廠提供我們所需要的類,并且通過一個輔助注冊的類,使我們需要的類注冊到我們的工廠里面,我們的調用者可以不通過知道我們類中的具體實現,就可以獲取到他們所需的類,并且完好的實現了類的封裝性.我們在以后修改或者替換我們的類的時候就不會影響調用者的代碼。

      posted @ 2019-09-24 16:24  飄雨的河  閱讀(311)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲人成人无码网WWW电影首页| 精品无码一区二区三区电影| 92自拍视频爽啪在线观看| 欧美老熟妇乱子伦牲交视频| 亚洲国产成人不卡高清麻豆| 亚洲夂夂婷婷色拍ww47| 欧美成人午夜精品免费福利| 99久久精品费精品国产一区二区 | 国产精品麻豆成人av网| 无码av不卡免费播放| 亚洲毛片多多影院| 丰满人妻跪趴高撅肥臀| 国产精品中文字幕免费| 国产欧美日韩精品第二区| 色噜噜亚洲男人的天堂| 红桃视频成人传媒| 亚洲熟妇色自偷自拍另类| 公天天吃我奶躁我的在线观看| 国产v综合v亚洲欧美大天堂| 在线播放深夜精品三级| 好屌草这里只有精品| 免费看女人与善牲交| 亚洲综合久久精品哦夜夜嗨 | 诱人的老师hd中文字幕| 噜噜噜噜私人影院| 亚洲人成网站在线播放2019| 玩弄丰满少妇人妻视频| 泗洪县| 国产裸体永久免费无遮挡| 特级做a爰片毛片免费看无码| 亚洲欧洲日韩国内高清| 日本久久香蕉一本一道| 日韩乱码人妻无码中文字幕| 亚洲国产精品高清久久久| 亚洲午夜精品久久久久久浪潮| 久久av中文字幕资源网| 亚洲人成电影网站 久久影视| 亚洲 校园 欧美 国产 另类 | 99久久免费精品国产色| 无码av中文字幕免费放| 国产馆在线精品极品粉嫩|