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