運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象
享元模式共享的關(guān)鍵是區(qū)分內(nèi)蘊(yùn)狀態(tài)(Internal state)和外蘊(yùn)狀態(tài)(external state)。
內(nèi)蘊(yùn)狀態(tài)是存儲(chǔ)在享元對(duì)象內(nèi)部不會(huì)改變的,可以共享。
外蘊(yùn)狀態(tài)是隨環(huán)境改變的,不可以共享的狀態(tài)。它可以改變方法的行為。
abstract public class Flyweight
{
//state外蘊(yùn)狀態(tài),改變方法的行為
abstract public void operation(String state);
}
public class ConcreteFlyweight extends Flyweight
{
private Character instrinsicState=null;
public ConcreteFlyweight(Character state)
{
this.instrinsicState=state;
}
public void operation(String state)
{
System.out.print("\nInstrinsic State="+instrinsicState+",Extrinsic State = "+state);
}
}
public class FlyweightFactory
{
private HashMap flies=new HashMap();
//根據(jù)內(nèi)蘊(yùn)狀態(tài)構(gòu)造對(duì)象
public Flyweight factory(Character state)
{
if(flies.containKey(state))
{
return (Flyweight)flies.get(state)
}
else
{
Flyweight fly=new ConcreteFlyweight(state);
flies.put(state,fly);
return fly;
}
}
public state void main(String[] args)
{
FlyweightFactory factory=new FlyweightFactory();
Flyweight fly=factory.factory(new Character('a'));
fly.operation("First call");
Flyweight fly2=factory.factory(new Character('b'));
fly2.operation("Second call");
Flyweight fly3=factory.factory(new Character('a'));
fly3.operation("Third call");
}
}