书城计算机网络大话设计模式
8183300000090

第90章 5 咖啡外卖店

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

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

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

1、Order。java订单抽象类

2、FlavorOrder。java订单实现类

3、FlavorFactory。java订单生成工厂

4、Client。java客户类、带有main方法的测试类

……1、Order。java

package flyweight;

public abstract class Order{

//执行卖出动作

public abstract void sell();

//获取咖啡口味

public abstract String getFlavor();

}

……1 end

……2、FlavorOrder。java

package flyweight;

public class FlavorOrder extends Order{

private String flavor;

public FlavorOrder(String flavor){

this。flavor=flavor;

}

public String getFlavor(){

return this。flavor;

}

public void sell(){

System。out。println(“卖出一杯[” flavor “]。”);

}

}

……2 end

……3、FlavorFactory。java

package flyweight;

import java。util。HashMap;

import java。util。Map;

public class FlavorFactory{

//订单池

private Map《String,Order》flavorPool=new HashMap《String,Order》(20);

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

private static FlavorFactory flavorFactory=new FlavorFactory();

private FlavorFactory(){}

public static FlavorFactory getInstance(){

return flavorFactory;

}

//获得订单

public Order getOrder(String flavor){

Order order=null;

if(flavorPool。containsKey(flavor)){

order=flavorPool。get(flavor);

}else{

//获得新口味订单

order=new FlavorOrder(flavor);

//放入对象池

flavorPool。put(flavor,order);

}

return order;

}

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

public int getTotalFlavorsMade(){

return flavorPool。size();

}

}

……3 end

……4、Client。java

package flyweight;

import java。util。ArrayList;

import java。util。List;

public class Client{

//客户下的订单

private static List《Order》orders=new ArrayList《Order》(100);

//订单对象生成工厂

private static FlavorFactory flavorFactory;

//增加订单

private static void takeOrders(String flavor){

orders。add(flavorFactory。getOrder(flavor));

}

public static void main(String[]args){

//订单生成工厂

flavorFactory=FlavorFactory。getInstance();

//增加订单

takeOrders(“摩卡”);

takeOrders(“卡布奇诺”);

takeOrders(“香草星冰乐”);

takeOrders(“香草星冰乐”);

takeOrders(“拿铁”);

takeOrders(“卡布奇诺”);

takeOrders(“拿铁”);

takeOrders(“卡布奇诺”);

takeOrders(“摩卡”);

takeOrders(“香草星冰乐”);

takeOrders(“卡布奇诺”);

takeOrders(“摩卡”);

takeOrders(“香草星冰乐”);

takeOrders(“拿铁”);

takeOrders(“拿铁”);

//卖咖啡

for(Order order:orders){

order。sell();

}

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

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

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

System。out。println(“\n共生成了” flavorFactory。getTotalFlavorsMade() “个FlavorOrder java对象!”);

}

}