<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Chan Chen Coding...

    Four: Flyweight Pattern

    運用共享技術有效地支持大量細粒度的對象,系統只使用少量的對象,而這些對象都相近,狀態變化很小,對象使用次數增多。

      UML類圖如下:

      

      其中類和對象的關系:

      1. Flyweight(抽象輕量級類):聲明一個接口,通過它可以接受外來的參數(狀態),并對新狀態做出出來(作用)。

      2. ConcreteFlyweight(具體輕量級類):實現Flyweight的接口,并為內部狀態增加存儲空間,ConcreteFlyweight對象必須是可以共享的,它所有存儲的狀態必須是內部的,它獨立存在于自己的環境中。

      3. UnsharedConcreteFlyweight(不共享具體輕量級類):不是所有的Flyweight子類都需要包兒共享,Flyweight的共享不是強制的。在某些Flyweight的結構層次中,UnsharedConcreteFlyweight對象通常將ConcreteFlyweight對象作為子節點。

      4. FlyweightFactory(輕量級類工廠):創建并管理flyweight對象;確保享用flyweight。當用戶請求一個flyweight時,FlyweightFactory提供一個已創建的實例或者創建一個實例。

      5. Client(客戶應用程序):維持一個對flyweight的引用;計算或存儲一個或多個flyweight的外部狀態。

      典型應用的順序圖如圖:

      

      客戶初次從輕量級類工廠取flyweight時,輕量級類工廠創建一個新的具體flyweight對象,并且保存起來,下次客戶取用時,就不用重新創建,直接在保存池中返回。客戶負責處理flyweight的狀態。

    • 實例1——文檔編輯器

      潛在的,每個字符都被大量的采用,因此共享這些字符對象將會節省大量的存儲空間。文檔編輯器的UML類圖如下:

      

    代碼
    復制代碼
     //Flyweight工廠
    class CharacterFactotry
    {
    private Hashtable characters = new Hashtable();
    public Character GetCharacter(char key)
    {
    //在初始化的Hashtable中取出字符
    Character character = (Character)characters[key];
    //如果取出的字符為null,初始化它
    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 Draw(int pointSize);
    }
    class CharacterA : Character
    {
    public CharacterA()
    {
    this.symbol = 'A';
    this.height = 100;
    this.width = 120;
    this.ascent = 70;
    this.descent = 0;
    }
    public override void Draw(int pointSize)
    {
    this.pointSize = pointSize;
    Console.WriteLine(
    this.symbol);
    }
    }
    class CharacterB : Character
    {
    public CharacterB()
    {
    this.symbol = 'B';
    this.height = 100;
    this.width = 140;
    this.ascent = 72;
    this.descent = 0;
    }
    public override void Draw(int pointSize)
    {
    this.pointSize = pointSize;
    Console.WriteLine(
    this.symbol);
    }
    }
    class CharacterZ : Character
    {
    public CharacterZ()
    {
    this.symbol = 'Z';
    this.height = 100;
    this.width = 100;
    this.ascent = 68;
    this.descent = 0;
    }
    public override void Draw(int pointSize)
    {
    this.pointSize = pointSize;
    Console.WriteLine(
    this.symbol);
    }
    }


    //客戶應用測試
    class Client
    {
    [STAThread]
    static void Main(string[] args)
    {
    //用字符數組創造document
    char[] document = { 'A', 'B', 'Z', 'Z', 'A', 'A' };
    CharacterFactotry f
    = new CharacterFactotry();
    //外部狀態
    int pointSize = 12;
    //為每一個字符使用一個flyweight對象
    foreach (char c in document)
    {
    Character character
    = f.GetCharacter(c);
    character.Draw(pointSize);
    }
    Console.Read();
    }
    }
    復制代碼

     

     

    • 優勢和缺陷

      Flyweight模式需要你認真考慮如何能細化對象,以減少處理的對象數量,從而減少存留對象在內存或其他存儲設備中的占用量。然而,此模式需要維護大量對象的外部狀態,如果外部狀態的數據量大,傳遞、查找、計算這些惡數據會變得非常復雜。當外部和內部的狀態很難分清時,不宜采用flyweight模式。

    • 應用情景

      下面的情景很適合應用輕量級模式:

      1. 系統需要存在大量的對象而共享某些本質的、不變的信息。

      2. 對象可以同時用于多個環境下。

      3. 在每個實例下,flyweight可以作為一個獨立的對象。



    -----------------------------------------------------
    Silence, the way to avoid many problems;
    Smile, the way to solve many problems;

    posted on 2012-10-30 15:08 Chan Chen 閱讀(186) 評論(0)  編輯  收藏 所屬分類: Design Pattern

    主站蜘蛛池模板: 无码精品A∨在线观看免费| 久久久久亚洲精品影视| 黄色网址免费在线观看| 亚洲色大成网站www永久一区| 99久久精品免费视频| 亚洲福利电影一区二区?| 国产无遮挡吃胸膜奶免费看| 男女交性无遮挡免费视频| 亚洲色图在线播放| 亚洲一区二区三区偷拍女厕| 国产精品视_精品国产免费 | 在线观看免费亚洲| 亚洲综合无码无在线观看| 亚洲国产综合人成综合网站00| 亚洲三级电影网址| 国产亚洲国产bv网站在线| 亚洲国产日韩综合久久精品| 亚洲6080yy久久无码产自国产| 午夜亚洲WWW湿好爽| 国产一区二区三区免费在线观看 | 亚洲第一区在线观看| 精品亚洲一区二区三区在线观看| 爱情岛论坛网亚洲品质自拍| 中文字幕亚洲日韩无线码| 亚洲av无码专区国产乱码在线观看| 久久亚洲精精品中文字幕| 色婷五月综激情亚洲综合| 最新亚洲人成无码网站| 二区久久国产乱子伦免费精品| 国产精品视频白浆免费视频| 亚洲免费电影网站| 亚洲精品无码久久久| 亚洲综合久久成人69| 亚洲视频精品在线| 免费毛片在线看不用播放器| 久久久久久亚洲精品不卡| 午夜成人无码福利免费视频| 99精品全国免费观看视频| 国产成人亚洲综合色影视| 日本一区二区在线免费观看 | 久久精品国产亚洲av麻豆蜜芽|