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