读书人

享元形式

发布时间: 2012-07-15 20:11:29 作者: rapoo

享元模式

享元模式的角色划分:

1,抽象享元角色:享元角色需要实现的公共接口。外蕴状态可以通过商业方法以参数的形式传入。

2,具体享角色:负责维护内蕴状态。且提供内蕴含状态的空间。内蕴状态不与环境有关,对象初始化时,内蕴含状态就已经产生。

3,享元工厂角色:负责维护和管理享元角色,在工厂中没有找到相应的享元对象,则负责创建相应的享元对象。

?本质工厂角色应该是个享元对象的容器。

4,客户端角色:自行维护外蕴状态,外蕴跟环境有关。

享元模式分单纯享元模式和复合享元模式

?这里就讲讲单纯享元模式。 下面以不同口味的冰棒为例。

//冰棒接口

public interface? Popsicle{

? //商业方法

?? public void buy();

?

}

?

//具体享元对象

public class GreenPeasPopsicle implments Popsicle{

?? //不同风味的雪糕,绿豆,荔枝味等 内蕴状态

??? String?? flavor = null;

?? public GreenPeasPopsicle(String flavor){

?????????????? this.flavor = flavor;

? }

//客人购买不同味道的雪糕

?public void buy(){

??? System.out.println("当钱被购买的雪糕风味是="+this.flavor);

}

//返回雪糕的名字

public String getFlavor(){

???? return flavor;

?}

}

?

//风味工厂类,可以单实例

public class?? PopsicleFactory{

private Map<String ,Popsicle> popsicleMap = new HashMap<String,Popsicle>();

?

?private PopsicleFactory instance = new PopsicleFactory();

//私有构造方法

?private PopsicleFactory(){

??

?}

//得工厂实例

public static PopsicleFactory getInstance(){

? return instance;

?}?

?

//维护和管理享元对象的工厂

?public Popsicle factory(String flavor){

? if(StringUtils.isBlank(flavor)){

?? return null;

?}

?

? if(popsicleMap .contain(flavor)){

???? return popsicleMap.get(flavor);

? }

?

? Popsicle popsicle = new GreenPeasPopsicle(flavor);

? popsicleMap.put(flavor,popsicle);

?}

}

//客户端端调用

public class? Client{

? public static void main(String args){

? //我要绿豆为的雪糕

?? Popsicle greePopsicle = PopsicleFactory.getInstance().factory("雪糕味");

?? grerPopsicle.buy();

???greePopsicle = PopsicleFactory.getInstance().factory("荔枝味");

? greePopsicle .buy();

? greePopsicle = PopsicleFactory.getInstance().factory("雪糕味");

? greePopsicle .buy();

?}

}

?

//打印结果

当钱被购买的雪糕风味是=雪糕味

当钱被购买的雪糕风味是=荔枝味

当钱被购买的雪糕风味是=雪糕味

?这里其实雪糕味只创建一个对象。因为他们的内蕴状态风味(雪糕味)是一样的。是共享的。

模式使用场景:

1,?大量使用对象产生时。

2,对象产生的内蕴状态不依赖环境而发生改变。

优点:

?提搞了性能以及不要创建重复的大量对象

缺点:

??查错比较困难。?

读书人网 >软件开发

热点推荐