??? 享元模式:運用共享技術有效地支持大量細粒度的對象,避免大量擁有相同內容的小類的開銷(如耗費內存),使大家共享一個類(元類).
? 適用環境:一個應用程序使用了大量的對象。
完全由于使用大量的對象,造成很大的存儲開銷。
對象的大多數狀態都可變為外部狀態。
如果刪除對象的外部狀態,那么可以用相對較少的共享對象取代很多組對象。
應用程序不依賴于對象標識。由于Flyweight對象可以被共享,對于概念上明顯有別的對象,標識測試將返回真值。
package?flyweight;


public?abstract?class?Flyweight
{
????//state是一個外蘊狀態
????public?abstract?void?operation(String?state);
} 具體享元類:
package?flyweight;


public?class?ConcreteFlyweight?extends?Flyweight
{
????private?Character?intrinsicState;
????//構造方法,內蘊作為參數傳入

????public?ConcreteFlyweight(Character?intrinsicState)
{
????????this.intrinsicState=intrinsicState;
????}
????//外蘊狀態作為參數傳入方法中,忙亂改變的是方法的行為

????public?void?operation(String?state)
{
????????System.out.println("IntrinsicState:"+intrinsicState+"?extrinsic?state:"+state);
????}
????
}享元工廠類:
package?flyweight;

import?java.util.*;


public?class?FlyweightFactory
{
????private?HashMap?files=new?HashMap();

????

????public?FlyweightFactory()
{}
????//內蘊狀態作為參數傳入

????public?Flyweight?factory(Character?state)
{
????????if(files.containsKey(state))
????????????return?(Flyweight)files.get(state);
????????else

?????????
{
?????????????????Flyweight?fly=new?ConcreteFlyweight(state);
?????????????????files.put(state,fly);
?????????????????return?fly;??????
?????????}
????}
????

????public?int?getSize()
{
????????return?files.size();
????}
}客戶類:
package?flyweight;


public?class?FlyweightPattern
{

????public?static?void?main(String[]?args)
{
????????
????????FlyweightFactory?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");
????????System.out.println(factory.getSize());
????????
????}
}運行結果:
IntrinsicState:a extrinsic state:first Call
IntrinsicState:b extrinsic state:second Call
IntrinsicState:a extrinsic state:Third Call
2
Press any key to continue...
參考資料:《Java與模式》
《設計模式速查手冊》
http://blog.csdn.net/qutr/archive/2006/07/27/987233.aspx
? 適用環境:
一個具體例子:
它涉及到四個角色:
抽象享元角色:此角色是所有具體享元類的超類,為這些類規定需要的接口,那些需要外蘊狀態(External State)的操作可以調用商業的方法以參數方式傳入。
具體享元角色:實現抽象享元所規定的接口,如果有內蘊狀態,則必須負責為內蘊提供存儲空間。享元對象的內蘊狀態必須與外部環境無關,從而使得享元對象在系統內共享。
享元工廠角色:負責創建與管理享元角色。本角色必須保證享元對象可以在系統內適當共享.
客戶端角色:維護一個對所有享元對象的引用,需要自行存儲所有享元對象的外蘊狀態。?
一個例子:
抽象享元類



















































































IntrinsicState:a extrinsic state:first Call
IntrinsicState:b extrinsic state:second Call
IntrinsicState:a extrinsic state:Third Call
2
Press any key to continue...
參考資料:《Java與模式》
《設計模式速查手冊》
http://blog.csdn.net/qutr/archive/2006/07/27/987233.aspx