??? 享元模式:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象,避免大量擁有相同內(nèi)容的小類的開銷(如耗費(fèi)內(nèi)存),使大家共享一個(gè)類(元類).
? 適用環(huán)境:一個(gè)應(yīng)用程序使用了大量的對(duì)象。
完全由于使用大量的對(duì)象,造成很大的存儲(chǔ)開銷。
對(duì)象的大多數(shù)狀態(tài)都可變?yōu)橥獠繝顟B(tài)。
如果刪除對(duì)象的外部狀態(tài),那么可以用相對(duì)較少的共享對(duì)象取代很多組對(duì)象。
應(yīng)用程序不依賴于對(duì)象標(biāo)識(shí)。由于Flyweight對(duì)象可以被共享,對(duì)于概念上明顯有別的對(duì)象,標(biāo)識(shí)測(cè)試將返回真值。
package?flyweight;


public?abstract?class?Flyweight
{
????//state是一個(gè)外蘊(yùn)狀態(tài)
????public?abstract?void?operation(String?state);
} 具體享元類:
package?flyweight;


public?class?ConcreteFlyweight?extends?Flyweight
{
????private?Character?intrinsicState;
????//構(gòu)造方法,內(nèi)蘊(yùn)作為參數(shù)傳入

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

????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()
{}
????//內(nèi)蘊(yùn)狀態(tài)作為參數(shù)傳入

????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());
????????
????}
}運(yùn)行結(jié)果:
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與模式》
《設(shè)計(jì)模式速查手冊(cè)》
http://blog.csdn.net/qutr/archive/2006/07/27/987233.aspx
? 適用環(huán)境:
一個(gè)具體例子:
它涉及到四個(gè)角色:
抽象享元角色:此角色是所有具體享元類的超類,為這些類規(guī)定需要的接口,那些需要外蘊(yùn)狀態(tài)(External State)的操作可以調(diào)用商業(yè)的方法以參數(shù)方式傳入。
具體享元角色:實(shí)現(xiàn)抽象享元所規(guī)定的接口,如果有內(nèi)蘊(yùn)狀態(tài),則必須負(fù)責(zé)為內(nèi)蘊(yùn)提供存儲(chǔ)空間。享元對(duì)象的內(nèi)蘊(yùn)狀態(tài)必須與外部環(huán)境無(wú)關(guān),從而使得享元對(duì)象在系統(tǒng)內(nèi)共享。
享元工廠角色:負(fù)責(zé)創(chuàng)建與管理享元角色。本角色必須保證享元對(duì)象可以在系統(tǒng)內(nèi)適當(dāng)共享.
客戶端角色:維護(hù)一個(gè)對(duì)所有享元對(duì)象的引用,需要自行存儲(chǔ)所有享元對(duì)象的外蘊(yùn)狀態(tài)。?
一個(gè)例子:
抽象享元類



















































































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與模式》
《設(shè)計(jì)模式速查手冊(cè)》
http://blog.csdn.net/qutr/archive/2006/07/27/987233.aspx