設計模式----Flyweight(享元)模式

來源:互聯網
上載者:User
設計模式 ----Flyweight( 享元 ) 模式   GOF 運用共用技術有效地支援大量細粒度的對象。   解釋一下概念: 也就是說在一個系統中如果有多個相同的對象,那麼只共用一份就可以了,不必每個都去執行個體化一個對象。比如說(這裡引用GOF書中的例子)一個文本系統,每個字母定一個對象,那麼大小寫字母一共就是52個,那麼就要定義52個對象。如果有一個1M的文本,那麼字母是何其的多,如果每個字母都定義一個對象那麼記憶體早就爆了。那麼如果要是每個字母都共用一個對象,那麼就大大節約了資源。   在Flyweight模式中,由於要產生各種各樣的對象,所以在Flyweight(享元)模式中常出現Factory模式。Flyweight的內部狀態是用來共用的,Flyweight factory負責維護一個Object Storage Service池(Flyweight Pool)來存放內部狀態的對象。Flyweight模式是一個提高程式效率和效能的模式,會大大加快程式的運行速度.應用場合很多,下面舉個例子:   先定義一個抽象的Flyweight類:

package  Flyweight;

public  abstract  class  Flyweight
... {
    public abstract void operation();
    
} // end abstract class Flyweight

在實現一個具體類:
package  Flyweight;

public  class  ConcreteFlyweight  extends  Flyweight
... {
    private String string;
    
    public ConcreteFlyweight(String str)
    ...{
        string = str;
    }//end ConcreteFlyweight(...)
    
    public void operation()
    ...{
        System.out.println("Concrete---Flyweight : " + string);
    }//end operation()
    
} // end class ConcreteFlyweight

實現一個Factory 方法類:
package  Flyweight;

import  java.util.Hashtable;

public  class  FlyweightFactory
... {
    private Hashtable flyweights = new Hashtable();//----------------------------1
    
    public FlyweightFactory() ...{
    }
    
    public Flyweight getFlyWeight(Object obj)
    ...{
        Flyweight flyweight = (Flyweight) flyweights.get(obj);//----------------2
        
        if(flyweight == null) ...{//---------------------------------------------------3
            //產生新的ConcreteFlyweight
            flyweight = new ConcreteFlyweight((String)obj);
            flyweights.put(obj, flyweight);//--------------------------------------5
        }
        return flyweight;//---------------------------------------------------------6
    }//end GetFlyWeight(...)
    
    public int getFlyweightSize()
    ...{
        return flyweights.size();
    }
    
} // end class FlyweightFactory
這個Factory 方法類非常關鍵,這裡詳細解釋一下:
在1處定義了一個Hashtable用來儲存各個對象;在2處選出要執行個體化的對象,在6處將該對象返回,如果在Hashtable中沒有要選擇的對象,此時變數flyweight為null,產生一個新的flyweight儲存在Hashtable中,並將該對象返回。

最後看看Flyweight的調用:
package  Flyweight;

import  java.util.Hashtable;

public  class  FlyweightPattern  ... {

    FlyweightFactory factory = new FlyweightFactory(); 
    Flyweight fly1;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.