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