国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++設計模式之享元模式(Flyweight)

2020-01-26 13:43:57
字體:
來源:轉載
供稿:網友

享元模式顧名思義就是羽量級模式或者蠅級模式,形容體量小的應用,該模式主要的設計目的是為了迎合系統大量相似數據的應用而生,減少用于創建和操作相似的細碎對象所花費的成本。大量的對象會消耗高內存,享元模式給出了一個解決方案,即通過共享對象來減少內存負載。

作用

通過復用相同的對象來減少對象的創建數量,創建更小的對象組,并通過共享實現重用。通過歸類,將對象的屬性分為內蘊狀態和外蘊狀態。要創建具體的享元對象,我們需要創建一個享元工廠來統一管理對象的生成和輸出,享元工廠是實現享元模式的關鍵。

舉個例子,享元模式可以看成是一個工具箱,而享元對象就是工具箱內的具體的工具,我們在使用工具的時候,不必每回臨時的制造工具,而是直接從工具箱里找到工具進行使用,這樣就大大節約了制造工具的成本時間和工具占用的空間。

享元模式比較迷惑在于理解兩種狀態的分類,內蘊狀態是對象本身的屬性,在生成對象以后一般不會進行改變,比如工具中的屬性:名字、大小、重量等,還有就是我們一般需要一個關鍵性的屬性作為其區別于其他對象的key,如工具的話我們可以把名稱作為找到工具的唯一標識。

外蘊狀態是對象的外部描述,是每個對象的可變部分,比如對工具的使用地點、使用時間、使用人、工作內容的描述,這些屬性不屬于對象本身,而是根據每回使用情況進行變化的,這就需要制作成接口進行外部調用,而外蘊狀態的維護是由調用者維護的,對象內不進行維護。

類視圖

實現

//Flyweightclass tool{public:  //內蘊狀態  string name;  int nSize;  int nWeight;public:  //外蘊狀態  virtual int used(string person, string work)=0;}//ConcreteFlyweightclass hammer : public tool{public:  hammer():name("hammer"){}  int used(string person, string work)  {    cout<< person <<"use"<<name<<"to" << work;  }}//ConcreteFlyweightclass screwdriver : public tool{  screwdriver():name("screwdriver"){}  int used(string person, string work)  {    cout<< person <<"use"<< name << " to" << work;  }}//ConcreteFlyweightclass saw : public tool{  saw():name("saw"){}  int used(string person, string work)  {    cout<< person <<"use"<< name <<"to" << work;  }}//FlyweightFactoryclass toolbox{public:  toolbox();  virtual ~toolbox()  {    map<string,tool*>::iterator it = m_tool.find(toolname);    for(it=m_tool.begin();it!=m_tool.end();it++)    {      delete it.second;    }  }  tool* GetTool(string toolname)  {    map<string,tool*>::iterator it = m_tool.find(toolname);    if(it != m_tool.end())    {      return (tool*) it.second;    }    else    {      tool* tooltemp= NULL;      if(toolname == "hammer")        tooltemp = new hammer();      else if(toolname == "screwdriver")        tooltemp = new screwdriver();      else if(toolname == "saw")        tooltemp = new saw();      if(tooltemp !=NULL)        m_tool.insert(make_pair<string,tool*>(toolname,tooltemp));      return tooltemp;    }  }private:  map<string,tool*> m_tool;}int main(){  //外蘊狀態 由調用者維護  string person1 = "zhangsan";  string person2 = "lisi";  string work1 = "make desk";  string work2 = "repair bike";  //生成工廠  toolbox tBox;  //獲取享元  tool* tool1 = tBox.GetTool("hammer");  tool1.used(person1,work1);  tool* tool2 = tBox.GetTool("screwdriver");  tool2.used(person2,work2);}

單享元(share)和復合享元(unshare)
復合享元也既是unshareFlyweight,其不再是單一的對象,而是一系列對象的組合,他們的關系由原來的一對一的關系,變成了一對多的關系。
舉例說明,如【DP】中比較經典的圍棋的例子,單享元模式下,我們對圍棋的顏色種類進行共享,再棋盤的工廠類中只需包含黑白兩顆棋子,就能完成對棋盤下棋的整個操作,而不用對每一個棋子進行操作。但是有一天需求增加了對勝負的要求,那么就需要對棋子的坐標進行記錄,對于黑白兩種顏色的棋子,相對應的就會有相同顏色棋子的坐標數組容器,like:map<string,vector<Point>> 這樣的結構。

應用場景

  • 需要創建大量對象時;
  • 大多數對象可以分為內蘊和外蘊狀態;
  • 應用程序需要使用多種對象,并且重復使用;

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凤城市| 蒙自县| 合山市| 鄂尔多斯市| 沾益县| 巴马| 玉环县| 北海市| 保靖县| 德清县| 博野县| 湖南省| 漠河县| 合江县| 涞源县| 渭南市| 怀安县| 昌平区| 乐平市| 通化市| 莆田市| 西峡县| 普陀区| 庄河市| 河东区| 电白县| 化州市| 乐安县| 井研县| 图们市| 南投县| 遂川县| 五华县| 宁化县| 莒南县| 曲靖市| 京山县| 昌图县| 宁城县| 阿鲁科尔沁旗| 巴塘县|