享元模式是對象的結構模式。
享元模式以共用的方式高效地支援大量的細粒度對象。享元對象能做到共用的關鍵是區分內蘊狀態(Internal State)和外蘊狀態(External State).
一個內蘊狀態是儲存在享元對象內部的,並且是不會隨環境改變而有所不同的。因此,一個享元可以具有內蘊狀態並可以共用。
一個外蘊狀態是可隨環境改變而改變的,不可以共用的狀態。享元對象的外蘊狀態必須由用戶端儲存,並在享元對象被建立之後,在需要使用的時候再傳入到享元對象內部。
外蘊狀態不可以影響享元對象的內蘊狀態。換句話說:它們是相互獨立的。
單純享元模式
複合享元模式
從上面的類圖可以看出,在複合享元模式中,享元對象構成合成模式。因此,複合享元模式實際上是單純享元模式與合成模式的組合。
在單純享元模式中,所有的享元模式對象都是可以共用的
1、抽象享元角色:此角色是所有的具體享元類的超類,為這些類規定出需要實現的公用介面。那些需要外蘊狀態(External State)的操作可以通過調用商業方法以參數形式傳入。
2、具體享元角色:實現抽象享元角色所規定的介面。如果有內蘊狀態的話,必須負責為內蘊狀態提供儲存空間。享元對象的內蘊狀態必須與對象所處的周圍環境無關,從而使得享元對象可以在系統內共用。
3、享元工廠角色:本角色負責建立和管理享元角色。本角色必須保證享元對象可以被系統適當地共用。當一個用戶端對象調用一個享元對象的時候,享元工廠角色會檢查系統中是否有一個複合要求的享元對象。如果已經有了,享元工廠角色就應當提供這個已有的享元對象;如果系統中沒有一個適當的享元對象的話,享元工廠角色就應當建立一個合適的享元對象。
4、用戶端角色:本角色需要維護一個對所有享元對象的引用。本角色需要自行儲存所有享元對象的外蘊狀態。
範例程式碼:
內蘊狀態由intrinsicState儲存 ,所有的內蘊狀態在對象被建立之後,就不可再改變了
外蘊狀態通過operation進行設定,由用戶端在需要的時候進行調用,並改變。
以下的代碼中,雖然申請了3個享元對象,但實際上建立的享元對象只有2個,這就是共用的含 義。
package com.javapatterns.flyweight.simple;
public class Client
{
private static FlyweightFactory factory;
static public void main(String[] args)
{
factory = new FlyweightFactory();
Flyweight fly = factory.factory(new Character('a'));
fly.operation("First Call");
fly = factory.factory(new Character('b'));
fly.operation("Second Call");
fly = factory.factory(new Character('a'));
fly.operation("Third Call");
factory.checkFlyweight();
}
}
package com.javapatterns.flyweight.simple;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
public class FlyweightFactory
{
private HashMap flies = new HashMap();
private Flyweight lnkFlyweight;
public FlyweightFactory(){}
public synchronized Flyweight factory(Character state)
{
if ( flies.containsKey( state ) )
{
return (Flyweight) flies.get( state );
}
else
{
Flyweight fly = new ConcreteFlyweight( state );
flies.put( state , fly);
return fly;
}
}
public void checkFlyweight()
{
Flyweight fly ;
int i = 0;
System.out.println("\n==========checkFlyweight()=============");
for ( Iterator it = flies.entrySet().iterator() ; it.hasNext() ; )
{
Map.Entry e = (Map.Entry) it.next();
System.out.println("Item " + (++i) + " : " + e.getKey());
}
System.out.println("==========checkFlyweight()=============");
}
}
package com.javapatterns.flyweight.simple;
public class ConcreteFlyweight extends Flyweight
{
private Character intrinsicState = null;
public ConcreteFlyweight(Character state)
{
this.intrinsicState = state;
}
public void operation(String state)
{
System.out.print( "\nIntrinsic State = " + intrinsicState +
", Extrinsic State = " + state);
}
}
package com.javapatterns.flyweight.simple;
abstract public class Flyweight
{
abstract public void operation(String state);
}
複合享元模式:
從圖上理解是比較容易的,但書中的代碼著實讓人暈的很,索性先跳過。