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

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

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

    一、FlyWeight模式定義:

    運用共享技術(shù)有效地支持大量細(xì)粒度對象。

    二、模式解說

    也就是說在一個系統(tǒng)中如果有多個相同的對象,那么只共享一份就可以了,不必每個都去實例化一個對象。在Flyweight模式中,由于要產(chǎn)生各種各樣的對象,所以在Flyweight(享元)模式中常出現(xiàn)Factory模式。Flyweight的內(nèi)部狀態(tài)是用來共享的,Flyweight factory負(fù)責(zé)維護(hù)一個對象存儲池(Flyweight Pool)來存放內(nèi)部狀態(tài)的對象。Flyweight模式是一個提高程序效率和性能的模式,會大大加快程序的運行速度。

    三、結(jié)構(gòu)圖

     

    享元模式所涉及的角色有抽象享元角色、具體(單純)享元角色、復(fù)合享元角色、享員工廠角色,以及客戶端角色等。

    抽象享元角色(Flyweight):此角色是所有的具體享元類的超類,為這些類規(guī)定出需要實現(xiàn)的公共接口或抽象類。那些需要外蘊狀態(tài)(External State)的操作可以通過方法的參數(shù)傳入。抽象享元的接口使得享元變得可能,但是并不強(qiáng)制子類實行共享,因此并非所有的享元對象都是可以共享的。

    具體享元(ConcreteFlyweight)角色:實現(xiàn)抽象享元角色所規(guī)定的接口。如果有內(nèi)蘊狀態(tài)的話,必須負(fù)責(zé)為內(nèi)蘊狀態(tài)提供存儲空間。享元對象的內(nèi)蘊狀態(tài)必須與對象所處的周圍環(huán)境無關(guān),從而使得享元對象可以在系統(tǒng)內(nèi)共享。有時候具體享元角色又叫做單純具體享元角色,因為復(fù)合享元角色是由單純具體享元角色通過復(fù)合而成的。

    復(fù)合享元(UnsharableFlyweight)角色:復(fù)合享元角色所代表的對象是不可以共享的,但是一個復(fù)合享元對象可以分解成為多個本身是單純享元對象的組合。復(fù)合享元角色又稱做不可共享的享元對象。這個角色一般很少使用。

    享元工廠(FlyweightFactoiy)角色:本角色負(fù)責(zé)創(chuàng)建和管理享元角色。本角色必須保證享元對象可以被系統(tǒng)適當(dāng)?shù)毓蚕怼.?dāng)一個客戶端對象請求一個享元對象的時候,享元工廠角色需要檢查系統(tǒng)中是否已經(jīng)有一個符合要求的享元對象,如果已經(jīng)有了,享元工廠角色就應(yīng)當(dāng)提供這個已有的享元對象;如果系統(tǒng)中沒有一個適當(dāng)?shù)南碓獙ο蟮脑挘碓S角色就應(yīng)當(dāng)創(chuàng)建一個新的合適的享元對象。

    客戶端(Client)角色:本角色還需要自行存儲所有享元對象的外蘊狀態(tài)。

     

     

    四、一個例子

     



    import java.util.Hashtable;


    /** 
     *
     * 
    @author <a href="mailto:flustar2008@163.com">flustar</a>
     * 
    @version 1.0 
     * Creation date: Jan 25, 2008 1:33:49 PM
     
    */

      
    // "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 extends Character
      {
        
    // Constructor
        public CharacterA()
        {
          
    this.symbol = 'A';
          
    this.height = 100;
          
    this.width = 120;
          
    this.ascent = 70;
          
    this.descent = 0;
        }

        
    public  void Display(int pointSize)
        {
          
    this.pointSize = pointSize;
         System.out.println(
    this.symbol +
            
    " (pointsize " + this.pointSize + ")");
        }
      }

      
    // "ConcreteFlyweight"

      
    class CharacterB extends Character
      {
        
    // Constructor
        public CharacterB()
        {
          
    this.symbol = 'B';
          
    this.height = 100;
          
    this.width = 140;
          
    this.ascent = 72;
          
    this.descent = 0;
        }

        
    public  void Display(int pointSize)
        {
          
    this.pointSize = pointSize;
         System.out.println(
    this.symbol +
            
    " (pointsize " + this.pointSize + ")");
        }

      }

      
    //  C, D, E, etc.

      
    // "ConcreteFlyweight"

      
    class CharacterZ extends Character
      {
        
    // Constructor
        public CharacterZ()
        {
          
    this.symbol = 'Z';
          
    this.height = 100;
          
    this.width = 100;
          
    this.ascent = 68;
          
    this.descent = 0;
        }

        
    public  void Display(int pointSize)
        {
          
    this.pointSize = pointSize;
          System.out.println(
    this.symbol +
            
    " (pointsize " + this.pointSize + ")");
        }
      }
      
    // "FlyweightFactory"

      
    class CharacterFactory
      {
        
    private Hashtable characters = new Hashtable();

        
    public Character GetCharacter(char key)
        {
          
    // Uses "lazy initialization"
          Character character = (Character)characters.get(key);
          
    if (character == null)
          {
            
    switch (key)
            {
              
    case 'A': character = new CharacterA(); break;
              
    case 'B': character = new CharacterB(); break;
                
    //
              case 'Z': character = new CharacterZ(); break;
            }
            characters.put(key, character);
          }
          
    return character;
        }
      }
    // test application
      public class Test
      {
        
    public static void main(String []args)
        {
          
    // 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
          for(char c : chars)
          {
            pointSize
    ++;
            Character character 
    = f.GetCharacter(c);
            character.Display(pointSize);
          }
     
          
        }
      }


    五、 適用性

    Flyweight模式的有效性很大程度上取決于如何使用它以及在何處使用它。當(dāng)以下情況都成立時使用Flyweight模式。

    1)  一個應(yīng)用程序使用了大量的對象。

    2)  完全由于使用大量的對象,造成很大的存儲開銷。

    3)  對象的大多數(shù)狀態(tài)都可變?yōu)橥獠繝顟B(tài)。

    4)  如果刪除對象的外部狀態(tài),那么可以用相對較少的共享對象取代很多組對象。

    5)  應(yīng)用程序不依賴對象標(biāo)識。

    六、優(yōu)缺點

    1)享元模式使得系統(tǒng)更加復(fù)雜。為了使對象可以共享,需要將一些狀態(tài)外部化,這使得程序的邏輯復(fù)雜化。

    2)享元模式將享元對象的狀態(tài)外部化,而讀取外部狀態(tài)使得運行時間稍微變長。

    七、參考

        《設(shè)計模式可復(fù)用面向?qū)ο筌浖幕A(chǔ)》

        《Design Pattern Framework 2.0》

     

    posts - 146, comments - 143, trackbacks - 0, articles - 0

    Copyright © flustar

    主站蜘蛛池模板: 成人免费无码大片a毛片| 成年免费大片黄在线观看岛国| 免费专区丝袜脚调教视频| 免费看美女被靠到爽| 怡红院亚洲怡红院首页| 亚洲视频中文字幕在线| 日本亚洲欧美色视频在线播放| 国产精品福利在线观看免费不卡| 2015日韩永久免费视频播放| 免费精品国产自产拍观看| 亚洲bt加勒比一区二区| 亚洲欧洲无码一区二区三区| 日韩免费高清播放器| 女人张腿给男人桶视频免费版| 亚洲色中文字幕无码AV| 亚洲色成人四虎在线观看| 国内精品一级毛片免费看| 午夜小视频免费观看| 亚洲人成网址在线观看| 色妞www精品视频免费看| 亚洲精品视频免费在线观看| 亚洲人午夜射精精品日韩| 亚洲国产午夜精品理论片| 亚洲高清免费视频| 成年女人免费视频播放77777 | 亚洲成在人天堂一区二区| 亚洲AV综合永久无码精品天堂| 亚洲欧洲免费视频| 亚洲欧洲日本在线| 2019亚洲午夜无码天堂| 国产免费AV片在线观看| 全黄性性激高免费视频| 亚洲日本va在线观看| 永久免费av无码网站yy| 又大又黄又粗又爽的免费视频| 亚洲天堂一区在线| 精品成人免费自拍视频| 免费人成视频x8x8入口| 美女视频黄免费亚洲| 精品一区二区三区免费毛片爱| 国产午夜亚洲精品理论片不卡 |