大话设计模式
字体: 16 + -

第90章

大b:“我就以咖啡外卖店写几个java类来描述说明flyweight设计模式的实现方式吧。”

客户买咖啡下订单,订单只区分咖啡口味,如果下了1w个订单,而咖啡店只卖20种口味的咖啡,那么我们就没有必要生成1w个订单对象,通过享元模式我们只需要生成20个订单对象。

这个例子举的不太好,但足以说明问题。下面是具体的代码。

1、order.java订单抽象类

2、flavororder.java订单实现类

3、flavorfactory.java订单生成工厂

4、client.java客户类、带有main方法的测试类

……1、order.java

packageflyweight;

publicabstractclassorder{

//执行卖出动作

publicabstractvoidsell();

//获取咖啡口味

publicabstractstringgetflavor();

}

……1end

……2、flavororder.java

packageflyweight;

publicclassflavororderextendsorder{

privatestringflavor;

publicflavororder(stringflavor){

this.flavor=flavor;

}

publicstringgetflavor(){

returnthis.flavor;

}

publicvoidsell(){

system.out.println(“卖出一杯[”+flavor+“]。”);

}

}

……2end

……3、flavorfactory.java

packageflyweight;

importjava.util.hashmap;

importjava.util.map;

publicclassflavorfactory{

//订单池

privatemap《string,order》flavorpool=newhashmap《string,order》(20);

//静态工厂,负责生成订单对象

privatestaticflavorfactoryflavorfactory=newflavorfactory();

privateflavorfactory(){}

publicstaticflavorfactorygetinstance(){

returnflavorfactory;

}

//获得订单

publicordergetorder(stringflavor){

orderorder=null;

if(flavorpool.containskey(flavor)){

order=flavorpool.get(flavor);

}else{

//获得新口味订单

order=newflavororder(flavor);

//放入对象池

flavorpool.put(flavor,order);

}

returnorder;

}

//获得已经卖出的咖啡全部口味数量

publicintgettotalflavorsmade(){

returnflavorpool.size();

}

}

……3end

……4、client.java

packageflyweight;

importjava.util.arraylist;

importjava.util.list;

publicclassclient{

//客户下的订单

privatestaticlist《order》orders=newarraylist《order》(100);

//订单对象生成工厂

privatestaticflavorfactoryflavorfactory;

//增加订单

privatestaticvoidtakeorders(stringflavor){

orders.add(flavorfactory.getorder(flavor));

}

publicstaticvoidmain(string[]args){

//订单生成工厂

flavorfactory=flavorfactory.getinstance();

//增加订单

takeorders(“摩卡”);

takeorders(“卡布奇诺”);

takeorders(“香草星冰乐”);

takeorders(“香草星冰乐”);

takeorders(“拿铁”);

takeorders(“卡布奇诺”);

takeorders(“拿铁”);

takeorders(“卡布奇诺”);

takeorders(“摩卡”);

takeorders(“香草星冰乐”);

takeorders(“卡布奇诺”);

takeorders(“摩卡”);

takeorders(“香草星冰乐”);

takeorders(“拿铁”);

takeorders(“拿铁”);

//卖咖啡

for(orderorder:orders){

order.sell();

}

//打印生成的订单java对象数量

system.out.println(“\n客户一共买了”+orders.size()+“杯咖啡!”);

//打印生成的订单java对象数量

system.out.println(“\n共生成了”+flavorfactory.gettotalflavorsmade()+“个flavororderjava对象!”);

}

}