亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

C++設計模式編程之Flyweight享元模式結構詳解

2020-05-23 14:06:39
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++設計模式編程的Flyweight享元模式結構,享元模式在實現過程中主要是要為共享對象提供一個存放的"倉庫"(對象池),需要的朋友可以參考下
 

由遇到的問題引出享元模式:

在面向對象系統的設計何實現中,創建對象是最為常見的操作。這里面就有一個問題:如果一個應用程序使用了太多的對象,就會造成很大的存儲開銷。特別是對于大量輕量級(細粒度)的對象,比如在文檔編輯器的設計過程中,我們如果為沒有字母創建一個對象的話,系統可能會因為大量的對象而造成存儲開銷的浪費。例如一個字母"a"在文檔中出現了100000 次,而實際上我們可以讓這一萬個字母"a"共享一個對象,當然因為在不同的位置可能字母"a"有不同的顯示效果(例如字體和大小等設置不同),在這種情況我們可以為將對象的狀態分為"外部狀態"和"內部狀態",將可以被共享(不會變化)的狀態作為內部狀態存儲在對象中,而外部對象(例如上面提到的字體、大小等)我們可以在適當的時候將外部對象最為參數傳遞給對象(例如在顯示的時候,將字體、大小等信息傳遞給對象)。

作用:運用共享技術有效地支持大量細粒度的對象。

內部狀態intrinsic和外部狀態extrinsic:

1)Flyweight模式中,最重要的是將對象分解成intrinsic和extrinsic兩部分。

2)內部狀態:在享元對象內部并且不會隨環境改變而改變的共享部分,可以稱為是享元對象的內部狀態

3)外部狀態:而隨環境改變而改變的,取決于應用環境,或是實時數據,這些不可以共享的東西就是外部狀態了。

4)內部狀態和外部狀態之間的區別:
  在Flyweight模式應用中,通常修改的是外部狀態屬性,而內部狀態屬性一般都是用于參考或計算時引用。
Flyweight執行時所需的狀態必定是內部的或外部的。內部狀態存儲于ConcreteFlyweight對象之中;而外部狀態則由Client對象存儲或計算。當用戶調用Flyweight對象的操作時,將該狀態傳遞給它。

以文字處理軟件為例:

  內部狀態存儲于flyweight中,它包含了獨立于flyweight場景的信息,這些信息使得flyweight可以被共享。如字符代碼,字符大小……

  外部狀態取決于flyweight場景,并根據場景而變化,因此不可共享。用戶對象負責在必要的時候將外部狀態傳遞給flyweight,如字符位置,字符顏色……

UML圖:

C++設計模式編程,Flyweight,享元模式

 

解析:
Flyweight:享元類的基類,定義一個接口,通過這個接口Flyweight可以接受并作用于外部狀態。

ConcreteFlyweight:實現Flyweight接口, 并為內部狀態( 如果有的話) 增加存儲空間。ConcreteFlyweight對象必須是可共享的。它所存儲的狀態必須是內部的(intrinsic);即,它必須獨立于ConcreteFlyweight對象的場景。

UnsharedConcreteFlyweight:并非所有的Flyweight子類都需要被共享。Flyweight接口使共享成為可能,但它并不強制共享。在Flyweight對象結構的某些層次,UnsharedConcreteFlyweight對象通常將ConcreteFlyweight對象作為子節點。

FlyweightFactory:

1) 創建并管理Flyweight對象。

2)確保合理地共享Flyweight。當用戶請求一個Flyweight時,FlyweightFactory對象提供一個已創建的實例或者創建一個(如果不存在的話)

Client
1)維持一個對Flyweight的引用。

2)計算或存儲一個(多個)Flyweight的外部狀態。

分析:
   享元模式可以避免大量非常相似類的開銷。在程序設計中,有時需要生成大量細粒度的類實例來表示數據。如果能發現這些實例數據除了幾個參數外基本都是相同的。有時就能夠大幅度地減少實例化的類的數量。如果能把那些參數移到類實例的外面,在方法調用時將它們傳遞進來,就可以通過共享大幅度地減少單個實例的數目。

  比如在文檔編輯器的設計過程中,我們如果為沒有字母創建一個對象的話,系統可能會因為大量的對象而造成存儲開銷的浪費。例如一個字母“a”在文檔中出現了100000次,而實際上我們可以讓這一萬個字母“a”共享一個對象,當然因為在不同的位置可能字母“a”有不同的顯示效果(例如字體和大小等設置不同),在這種情況我們可以為將對象的狀態分為“外部狀態”和“內部狀態”,將可以被共享(不會變化)的狀態作為內部狀態存儲在對象中,而外部對象(例如上面提到的字體、大小等)我們可以在適當的時候將外部對象最為參數傳遞給對象(例如在顯示的時候,將字體、大小等信息傳遞給對象)。

  Flyweight的內部狀態是用來共享的,Flyweightfactory負責維護一個Flyweight池(存放內部狀態的對象),當客戶端請求一個共享Flyweight時,這個factory首先搜索池中是否已經有可適用的,如果有,factory只是簡單返回送出這個對象,否則,創建一個新的對象,加入到池中,再返回送出這個對象.池為重復或可共享的對象、屬性設置一個緩沖,稱為內部狀態。這些內部狀態一般情況下都是不可修改的,也就是在第一個對象、屬性被創建后,就不會去修改了(否則就沒意義了)。

  Flyweight 對對象的內部狀態進行共享,只為每種內部狀態創建一個實例,對內部狀態使用了單例模式。

  用戶不應直接對ConcreteFlyweight類進行實例化,而只能從FlyweightFactory對象得到ConcreteFlyweight對象,這可以保證對它們適當地進行共享。

  存儲節約由以下幾個因素決定:
  1) 因為共享,實例總數減少的數目
  2) 對象內部狀態的平均數目
  3) 外部狀態是計算的還是存儲的

實現要點
1)享元工廠維護一張享元實例表。

2)享元不可共享的狀態需要在外部維護。即刪除外部狀態:該模式的可用性在很大程度上取決于是否容易識別外部狀態并將它從共享對象中刪除。

3)按照需求可以對享元角色進行抽象。

4)管理共享對象:引用計數和垃圾回收……

何時采用
1)如果一個應用程序使用了大量的對象,而大量的這些對象造成了很大的存儲開銷時就應該考慮使用;

2)還有就是對象的大多數狀態可變為外部狀態,如果刪除對象的外部狀態,那么可以用相對較少的共享對象取代很多組對象,此時可以考慮所使用享元模式。

3)系統中有大量耗費了大量內存的細粒度對象,并且對外界來說這些對沒有任何差別的(或者說經過改造后可以是沒有差別的)。

  在文檔編輯器例子中如果一個字符對應一個對象,那么一篇文檔所要容納的對象將是非常的龐大耗費大量的內存。而實際組成文檔的字符是有限的,是由這些字符不同的組合和排列得到的。所以需要共享,將基本的字符進行共享,將使得字符對象變得有限。

示例:
享元模式在編輯器系統中大量使用。一個文本編輯器往往會提供很多種字體,而通常的做法就是將每一個字母做成一個享元對象。享元對象的內蘊狀態就是這個字母,而字母在文本中的位置和字模風格等其他信息則是外蘊狀態。比如,字母a可能出現在文本的很多地方,雖然這些字母a的位置和字模風格不同,但是所有這些地方使用的都是同一個字母對象。這樣一來,字母對象就可以在整個系統中共享。

// Flyweight pattern -- Real World example using System;using System.Collections;namespace DoFactory.GangOfFour.Flyweight.RealWorld{ // MainApp test application  class MainApp {  static void Main()  {   // Build a document with text    string document = "AAZZBBZB";   char[] chars = document.ToCharArray();   CharacterFactory f = new CharacterFactory();   // extrinsic state    int pointSize = 10;   // For each character use a flyweight object    foreach (char c in chars)   {    pointSize++;    Character character = f.GetCharacter(c);    character.Display(pointSize);   }   // Wait for user    Console.Read();  } } // "FlyweightFactory"  class CharacterFactory {  private Hashtable characters = new Hashtable();  public Character GetCharacter(char key)  {   // Uses "lazy initialization"    Character character = characters[key] as Character;   if (character == null)   {    switch (key)    {     case 'A': character = new CharacterA(); break;     case 'B': character = new CharacterB(); break;      //      case 'Z': character = new CharacterZ(); break;    }    characters.Add(key, character);   }   return character;  } } // "Flyweight"  abstract class Character {  protected char symbol;  protected int width;  protected int height;  protected int ascent;  protected int descent;  protected int pointSize;  public abstract void Display(int pointSize); } // "ConcreteFlyweight"  class CharacterA : Character {  // Constructor   public CharacterA()  {   this.symbol = 'A';   this.height = 100;   this.width = 120;   this.ascent = 70;   this.descent = 0;  }  public override void Display(int pointSize)  {   this.pointSize = pointSize;   Console.WriteLine(this.symbol +     " (pointsize " + this.pointSize + ")");  } } // "ConcreteFlyweight"  class CharacterB : Character {  // Constructor   public CharacterB()  {   this.symbol = 'B';   this.height = 100;   this.width = 140;   this.ascent = 72;   this.descent = 0;  }  public override void Display(int pointSize)  {   this.pointSize = pointSize;   Console.WriteLine(this.symbol +     " (pointsize " + this.pointSize + ")");  } } // C, D, E, etc.  // "ConcreteFlyweight"  class CharacterZ : Character {  // Constructor   public CharacterZ()  {   this.symbol = 'Z';   this.height = 100;   this.width = 100;   this.ascent = 68;   this.descent = 0;  }  public override void Display(int pointSize)  {   this.pointSize = pointSize;   Console.WriteLine(this.symbol +     " (pointsize " + this.pointSize + ")");  } }}

Output:

C++設計模式編程,Flyweight,享元模式

 

享元模式的優點和缺點

享元模式的優點在于它大幅度地降低內存中對象的數量。但是,它做到這一點所付出的代價也是很高的:
享元模式使得系統更加復雜。為了使對象可以共享,需要將一些狀態外部化,這使得程序的邏輯復雜化。
享元模式將享元對象的狀態外部化,而讀取外部狀態使得運行時間稍微變長。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧洲亚洲女同hd| 欧美诱惑福利视频| 亚洲自拍高清视频网站| 91免费福利视频| 日本19禁啪啪免费观看www| 中文字幕国产亚洲| 色妞欧美日韩在线| 美女999久久久精品视频| 久久国产色av| 一区二区在线视频| 欧美猛交ⅹxxx乱大交视频| 亚洲午夜性刺激影院| 精品日本美女福利在线观看| 91sao在线观看国产| 欧美一级黄色网| 日韩视频欧美视频| 国产视频福利一区| 在线午夜精品自拍| 日韩欧美国产中文字幕| 91久久精品美女高潮| 亚洲欧洲日产国码av系列天堂| 在线看福利67194| 欧美xxxx做受欧美.88| 欧美限制级电影在线观看| 国产精品对白刺激| 成人欧美一区二区三区黑人孕妇| 久久精品一偷一偷国产| 国产精品jvid在线观看蜜臀| 国产一区二区三区在线播放免费观看| 国产成人福利网站| 北条麻妃久久精品| 亚洲精品一区二区三区婷婷月| 日韩欧美国产免费播放| 欧美黄色片免费观看| 日产精品99久久久久久| www.国产一区| 欧美裸体xxxx极品少妇| 欧美极品在线播放| 国产一区二区视频在线观看| 国产精品爽爽ⅴa在线观看| 精品国产电影一区| 精品久久久久久久大神国产| 国内精品久久久| 亚洲国产精品99久久| www.久久草.com| 97在线免费观看视频| 成人网在线免费观看| 在线成人激情视频| 欧美国产亚洲精品久久久8v| 欧美激情一区二区三区久久久| 久久免费视频在线| 永久免费精品影视网站| 欧美xxxx14xxxxx性爽| 成人免费看黄网站| 国内精品一区二区三区| 中文字幕在线成人| 亚洲视频在线观看视频| 亚洲人午夜色婷婷| 久久免费国产精品1| 日韩欧美亚洲成人| 日韩欧美在线观看视频| 国产玖玖精品视频| 欧美高清在线视频观看不卡| 日韩久久精品成人| 国产精品视频中文字幕91| 国产欧美久久一区二区| 亚洲一区二区久久久久久| 91久久久久久久久久久久久| 国产日韩在线亚洲字幕中文| 国产精品电影一区| 国产亚洲福利一区| 亚洲国产一区自拍| 97视频免费在线看| 国内揄拍国内精品| 欧美亚洲视频在线观看| **欧美日韩vr在线| 国产精品9999| 国产欧美精品一区二区三区介绍| 日韩在线视频导航| 国产精品偷伦一区二区| 夜夜嗨av色一区二区不卡| 精品国产乱码久久久久久天美| 色综合久久88| 精品久久久久久久久久久久久| 日韩在线视频国产| 国产精品一区二区在线| 日韩欧美aaa| 久久天堂电影网| 成人97在线观看视频| 国产日韩一区在线| 欧美大秀在线观看| 欧美日韩激情美女| 欧美日韩黄色大片| 热久久免费视频精品| 国产欧美久久久久久| 亚洲跨种族黑人xxx| 免费成人高清视频| 国产精品白嫩初高中害羞小美女| 欧美激情第99页| 日韩精品免费在线| 精品中文字幕在线| 亚洲人成网站在线播| 国内精品视频久久| 在线观看国产精品91| 91香蕉亚洲精品| 日韩av123| 中文字幕亚洲专区| 久久精品国产久精国产思思| 精品国产一区二区三区久久久| 亚洲日本欧美日韩高观看| 日本一区二区在线免费播放| 精品在线欧美视频| 欧美久久精品午夜青青大伊人| 国产精品白嫩美女在线观看| 亚洲成人网在线观看| 成人欧美一区二区三区黑人孕妇| 国产日韩欧美电影在线观看| 色婷婷亚洲mv天堂mv在影片| 国产高清视频一区三区| 亚洲淫片在线视频| 国产精品欧美日韩一区二区| 日韩欧美极品在线观看| 欧美极品xxxx| 欧美在线免费看| 一区二区三区亚洲| 日韩电影中文字幕一区| 夜夜嗨av色一区二区不卡| 色悠悠国产精品| 日韩69视频在线观看| 亚洲国产精品va在看黑人| 最近更新的2019中文字幕| 91在线国产电影| 7777kkkk成人观看| 欧美电影在线播放| 日韩麻豆第一页| 欧美午夜www高清视频| 91精品国产乱码久久久久久久久| xxxxx成人.com| 宅男66日本亚洲欧美视频| 日韩中文字幕在线| 久久久久999| 国产91在线播放精品91| www.欧美免费| 久热在线中文字幕色999舞| 午夜精品一区二区三区在线视| 欧美成年人视频网站| 亚洲成人精品在线| 国产成人亚洲综合91| 日韩福利视频在线观看| 日韩av免费看网站| 成人黄色生活片| 欧美激情亚洲综合一区| 亚洲国产精品va在线| 欧美最猛性xxxxx免费| 国产男人精品视频| 日韩免费观看av| 日本19禁啪啪免费观看www| 亚洲a级在线播放观看| 全球成人中文在线| 国产精品久久久久久一区二区| 国产www精品| 日本aⅴ大伊香蕉精品视频| 日韩av在线影院| 国产欧美在线播放|