第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对象!”);
}
}