享元模式核心掌握的一點就是——共享。如果一個程式代碼中存在大量細粒度的對象,而這些大量的對象造成了很大的存儲開銷時就應該考慮使用。例如一個部落格網站,每個人根據自己的賬号登入自己的部落格,此時每個“部落格類”就應該成為共享,這也稱為内部狀态,但每個人部落格裡的資料又不同,這時用不同的賬号區分也即是稱為外部狀态。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yM1kzM2MjM2YTMtgjMzUTNwADMwMTMwEjNxAjMtYDNyAzM28CXwEjNxAjMvwlN0IDMzYzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
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 }
這樣我們就實作了一個最簡的享元模式,給出享元模式的定義:運用共享技術有效地支援大量細粒度對象。那什麼時候能考慮使用享元模式呢?如果一個應用程式使用了大量的對象,而大量的這些對象造成了很大的存儲開銷時就應該考慮使用;還有就是對象的大多數狀态可以外部狀态,如果删除對象的外部狀态,那麼可以用相對較少的共享對象取代很多組對象,此時可以考慮使用享元模式。——《大話設計模式》
不積跬步,無以至千裡;不積小流,無以成江海。