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

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

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

    一、FlyWeight模式定義:

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

    二、模式解說

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

    三、結構圖

     

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

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

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

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

    享元工廠(FlyweightFactoiy)角色:本角色負責創(chuàng)建和管理享元角色。本角色必須保證享元對象可以被系統(tǒng)適當?shù)毓蚕怼.斠粋€客戶端對象請求一個享元對象的時候,享元工廠角色需要檢查系統(tǒng)中是否已經有一個符合要求的享元對象,如果已經有了,享元工廠角色就應當提供這個已有的享元對象;如果系統(tǒng)中沒有一個適當?shù)南碓獙ο蟮脑挘碓S角色就應當創(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模式的有效性很大程度上取決于如何使用它以及在何處使用它。當以下情況都成立時使用Flyweight模式。

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

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

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

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

    5)  應用程序不依賴對象標識。

    六、優(yōu)缺點

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

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

    七、參考

        《設計模式可復用面向對象軟件的基礎》

        《Design Pattern Framework 2.0》

     

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

    Copyright © flustar

    主站蜘蛛池模板: 日日AV拍夜夜添久久免费| 永久免费av无码网站韩国毛片| 成人免费一区二区三区在线观看| 亚洲黄色在线电影| 1000部拍拍拍18勿入免费视频下载| 久久亚洲精品成人| 成人免费黄色网址| 亚洲午夜无码毛片av久久京东热| 日韩免费视频在线观看| 国产产在线精品亚洲AAVV| 亚洲 无码 在线 专区| 中文永久免费观看网站| 国产亚洲人成网站在线观看不卡| 99在线观看视频免费| 亚洲国产成人久久99精品| 成人免费一区二区无码视频| 亚洲第一成年网站视频| 亚洲精品无码专区久久同性男| 两个人www免费高清视频| 久久精品蜜芽亚洲国产AV| 91免费资源网站入口| 真人无码作爱免费视频| 亚洲一区二区三区无码中文字幕| 91麻豆国产免费观看| 亚洲乱码av中文一区二区| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 青青操免费在线视频| 亚洲av成人无码久久精品| 波多野结衣在线免费观看| 边摸边吃奶边做爽免费视频99| 亚洲国产婷婷六月丁香| 免费观看无遮挡www的小视频| 亚洲国产无线乱码在线观看| 亚洲精品国产高清嫩草影院 | jizz中国免费| 亚洲色欲或者高潮影院| 国产aa免费视频| 69国产精品视频免费| 色屁屁在线观看视频免费| 久久亚洲春色中文字幕久久久| 国产成人免费A在线视频|