天天看點

享元模式

享元模式核心掌握的一點就是——共享。如果一個程式代碼中存在大量細粒度的對象,而這些大量的對象造成了很大的存儲開銷時就應該考慮使用。例如一個部落格網站,每個人根據自己的賬号登入自己的部落格,此時每個“部落格類”就應該成為共享,這也稱為内部狀态,但每個人部落格裡的資料又不同,這時用不同的賬号區分也即是稱為外部狀态。

享元模式
UML類圖如圖所示。我們将具體的享元類抽象成一個接口。

1 package day_12_flyweight;
 2 
 3 /**
 4  * 享元類接口
 5  * @author 餘林豐
 6  *
 7  * 2016年10月12日
 8  */
 9 public interface Flyweight {
10     void operation(int extrinsicstate);  //這裡的extrinsicstate就是上面所說的外部狀态
11 }      

對享元類接口的具體實作。

1 package day_12_flyweight;
 2 
 3 /**
 4  * 具體享元類
 5  * @author 餘林豐
 6  *
 7  * 2016年10月12日
 8  */
 9 public class ConcreteFlyweight implements Flyweight {
10 
11     /* (non-Javadoc)
12      * @see day_12_flyweight.Flyweight#operation(int)
13      */
14     @Override
15     public void operation(int extrinsicstate) {
16         System.out.println("部落格,賬号:" + extrinsicstate);
17     }
18 
19 }      

享元類工廠。

1 package day_12_flyweight;
 2 
 3 import java.util.HashMap;
 4 
 5 /**
 6  * 享元類工廠
 7  * @author 餘林豐
 8  *
 9  * 2016年10月12日
10  */
11 public class FlyweightFactory {
12     private HashMap<String, ConcreteFlyweight> flyweights = new HashMap<String, ConcreteFlyweight>();
13     
14     public FlyweightFactory(){
15         flyweights.put("X", new ConcreteFlyweight());
16         flyweights.put("Y", new ConcreteFlyweight());
17         flyweights.put("Z", new ConcreteFlyweight());
18     }
19     
20     public Flyweight getFlyweight(String key){
21         return ((Flyweight)flyweights.get(key));
22     }
23 }      
1 package day_12_flyweight;
 2 
 3 /**
 4  * 用戶端測試
 5  * @author 餘林豐
 6  *
 7  * 2016年10月12日
 8  */
 9 public class Client {
10     public static void main(String[] args){
11         int extrinsicstate = 100;        //代碼外部狀态
12         FlyweightFactory f = new FlyweightFactory();
13         Flyweight fx = f.getFlyweight("X");
14         fx.operation(extrinsicstate);
15         
16         Flyweight fy = f.getFlyweight("Y");
17         fx.operation(--extrinsicstate);
18     }
19     
20 }      

這樣我們就實作了一個最簡的享元模式,給出享元模式的定義:運用共享技術有效地支援大量細粒度對象。那什麼時候能考慮使用享元模式呢?如果一個應用程式使用了大量的對象,而大量的這些對象造成了很大的存儲開銷時就應該考慮使用;還有就是對象的大多數狀态可以外部狀态,如果删除對象的外部狀态,那麼可以用相對較少的共享對象取代很多組對象,此時可以考慮使用享元模式。——《大話設計模式》

不積跬步,無以至千裡;不積小流,無以成江海。