運用共享技術(shù)有效地支持大量細粒度的對象
享元模式共享的關(guān)鍵是區(qū)分內(nèi)蘊狀態(tài)(Internal state)和外蘊狀態(tài)(external state)。
內(nèi)蘊狀態(tài)是存儲在享元對象內(nèi)部不會改變的,可以共享。
外蘊狀態(tài)是隨環(huán)境改變的,不可以共享的狀態(tài)。它可以改變方法的行為。

享元模式共享的關(guān)鍵是區(qū)分內(nèi)蘊狀態(tài)(Internal state)和外蘊狀態(tài)(external state)。
內(nèi)蘊狀態(tài)是存儲在享元對象內(nèi)部不會改變的,可以共享。
外蘊狀態(tài)是隨環(huán)境改變的,不可以共享的狀態(tài)。它可以改變方法的行為。

abstract public class Flyweight
{
//state外蘊狀態(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)蘊狀態(tài)構(gòu)造對象
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");
}
}
{
//state外蘊狀態(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)蘊狀態(tài)構(gòu)造對象
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");
}
}