第90章(1 / 1)

大话设计模式 吴强 1237 字 2个月前

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

}

}