欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++設(shè)計(jì)模式之享元模式(Flyweight)

 更新時(shí)間:2018年04月07日 11:22:23   作者:chencarl  
這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之享元模式Flyweight,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

享元模式顧名思義就是羽量級(jí)模式或者蠅級(jí)模式,形容體量小的應(yīng)用,該模式主要的設(shè)計(jì)目的是為了迎合系統(tǒng)大量相似數(shù)據(jù)的應(yīng)用而生,減少用于創(chuàng)建和操作相似的細(xì)碎對(duì)象所花費(fèi)的成本。大量的對(duì)象會(huì)消耗高內(nèi)存,享元模式給出了一個(gè)解決方案,即通過共享對(duì)象來減少內(nèi)存負(fù)載。

作用

通過復(fù)用相同的對(duì)象來減少對(duì)象的創(chuàng)建數(shù)量,創(chuàng)建更小的對(duì)象組,并通過共享實(shí)現(xiàn)重用。通過歸類,將對(duì)象的屬性分為內(nèi)蘊(yùn)狀態(tài)和外蘊(yùn)狀態(tài)。要?jiǎng)?chuàng)建具體的享元對(duì)象,我們需要?jiǎng)?chuàng)建一個(gè)享元工廠來統(tǒng)一管理對(duì)象的生成和輸出,享元工廠是實(shí)現(xiàn)享元模式的關(guān)鍵。

舉個(gè)例子,享元模式可以看成是一個(gè)工具箱,而享元對(duì)象就是工具箱內(nèi)的具體的工具,我們?cè)谑褂霉ぞ叩臅r(shí)候,不必每回臨時(shí)的制造工具,而是直接從工具箱里找到工具進(jìn)行使用,這樣就大大節(jié)約了制造工具的成本時(shí)間和工具占用的空間。

享元模式比較迷惑在于理解兩種狀態(tài)的分類,內(nèi)蘊(yùn)狀態(tài)是對(duì)象本身的屬性,在生成對(duì)象以后一般不會(huì)進(jìn)行改變,比如工具中的屬性:名字、大小、重量等,還有就是我們一般需要一個(gè)關(guān)鍵性的屬性作為其區(qū)別于其他對(duì)象的key,如工具的話我們可以把名稱作為找到工具的唯一標(biāo)識(shí)。

外蘊(yùn)狀態(tài)是對(duì)象的外部描述,是每個(gè)對(duì)象的可變部分,比如對(duì)工具的使用地點(diǎn)、使用時(shí)間、使用人、工作內(nèi)容的描述,這些屬性不屬于對(duì)象本身,而是根據(jù)每回使用情況進(jìn)行變化的,這就需要制作成接口進(jìn)行外部調(diào)用,而外蘊(yùn)狀態(tài)的維護(hù)是由調(diào)用者維護(hù)的,對(duì)象內(nèi)不進(jìn)行維護(hù)。

類視圖

實(shí)現(xiàn)

//Flyweight
class tool
{
public:
  //內(nèi)蘊(yùn)狀態(tài)
  string name;
  int nSize;
  int nWeight;
public:
  //外蘊(yùn)狀態(tài)
  virtual int used(string person, string work)=0;
}
//ConcreteFlyweight
class hammer : public tool
{
public:
  hammer():name("hammer"){}
  int used(string person, string work)
  {
    cout<< person <<"use"<<name<<"to" << work;
  }

}
//ConcreteFlyweight
class screwdriver : public tool
{
  screwdriver():name("screwdriver"){}
  int used(string person, string work)
  {
    cout<< person <<"use"<< name << " to" << work;
  }
}
//ConcreteFlyweight
class saw : public tool
{
  saw():name("saw"){}
  int used(string person, string work)
  {
    cout<< person <<"use"<< name <<"to" << work;
  }
}

//FlyweightFactory
class 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()
{
  //外蘊(yùn)狀態(tài) 由調(diào)用者維護(hù)
  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)和復(fù)合享元(unshare)
復(fù)合享元也既是unshareFlyweight,其不再是單一的對(duì)象,而是一系列對(duì)象的組合,他們的關(guān)系由原來的一對(duì)一的關(guān)系,變成了一對(duì)多的關(guān)系。
舉例說明,如【DP】中比較經(jīng)典的圍棋的例子,單享元模式下,我們對(duì)圍棋的顏色種類進(jìn)行共享,再棋盤的工廠類中只需包含黑白兩顆棋子,就能完成對(duì)棋盤下棋的整個(gè)操作,而不用對(duì)每一個(gè)棋子進(jìn)行操作。但是有一天需求增加了對(duì)勝負(fù)的要求,那么就需要對(duì)棋子的坐標(biāo)進(jìn)行記錄,對(duì)于黑白兩種顏色的棋子,相對(duì)應(yīng)的就會(huì)有相同顏色棋子的坐標(biāo)數(shù)組容器,like:map<string,vector<Point>> 這樣的結(jié)構(gòu)。

應(yīng)用場景

  • 需要?jiǎng)?chuàng)建大量對(duì)象時(shí);
  • 大多數(shù)對(duì)象可以分為內(nèi)蘊(yùn)和外蘊(yùn)狀態(tài);
  • 應(yīng)用程序需要使用多種對(duì)象,并且重復(fù)使用;

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • c語言for、while和do-while循環(huán)之間的區(qū)別

    c語言for、while和do-while循環(huán)之間的區(qū)別

    大家好,本篇文章主要講的是c語言for、while和do-while循環(huán)之間的區(qū)別,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C語言簡單實(shí)現(xiàn)快速排序

    C語言簡單實(shí)現(xiàn)快速排序

    快速排序是一種不穩(wěn)定排序,這篇文章主要為大家詳細(xì)介紹了C語言簡單實(shí)現(xiàn)快速排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++ LeetCode300最長遞增子序列

    C++ LeetCode300最長遞增子序列

    這篇文章主要為大家介紹了C++ LeetCode300最長遞增子序列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 詳解C++中OpenSSL動(dòng)態(tài)鏈接庫的使用

    詳解C++中OpenSSL動(dòng)態(tài)鏈接庫的使用

    這篇文章主要介紹了OpenSSL動(dòng)態(tài)鏈接庫的使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • C++11標(biāo)準(zhǔn)庫 互斥鎖 <mutex> 詳解

    C++11標(biāo)準(zhǔn)庫 互斥鎖 <mutex> 詳解

    這篇文章主要介紹了C++11標(biāo)準(zhǔn)庫互斥鎖 <mutex> 的相關(guān)知識(shí),使用call_once()的時(shí)候,需要一個(gè)once_flag作為call_once()的傳入?yún)?shù),本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-07-07
  • 手把手教你如何一眼分辨是C還是C++

    手把手教你如何一眼分辨是C還是C++

    在很大程度上,C++是C的超集,這意味著一個(gè)有效的C程序也是一個(gè)有效的C++程序,下面這篇文章主要給大家介紹了關(guān)于如何一眼分辨是C還是C++的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • C++實(shí)現(xiàn)LeetCode(6.字型轉(zhuǎn)換字符串)

    C++實(shí)現(xiàn)LeetCode(6.字型轉(zhuǎn)換字符串)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(6.字型轉(zhuǎn)換字符串),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言圣誕樹的實(shí)現(xiàn)示例

    C語言圣誕樹的實(shí)現(xiàn)示例

    本篇主要介紹了C語言圣誕樹的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C語言實(shí)現(xiàn)撲克牌計(jì)算24點(diǎn)

    C語言實(shí)現(xiàn)撲克牌計(jì)算24點(diǎn)

    這篇文章主要為大家詳細(xì)介紹了C語言如何實(shí)現(xiàn)撲克牌計(jì)算24點(diǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C++數(shù)據(jù)結(jié)構(gòu)之單鏈表

    C++數(shù)據(jù)結(jié)構(gòu)之單鏈表

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之單鏈表,鏈表是由一個(gè)個(gè)結(jié)點(diǎn)鏈結(jié)成的。結(jié)點(diǎn)包括數(shù)據(jù)域和指針域兩部分,數(shù)據(jù)域用來存儲(chǔ)數(shù)據(jù)元素的信息,指針域用來存儲(chǔ)下一個(gè)結(jié)點(diǎn)的地址,更詳細(xì)內(nèi)容請(qǐng)需要的小伙伴參考下面文章內(nèi)容
    2022-01-01

最新評(píng)論