簡體中文 | 繁體中文

大話設計模式-----第90章


我要我們在一起 校長法則 桃運小村醫 愛神的惡作劇 靜州往事 大豪商,掌家娘 無敵萌妻限量版 毒醫媽咪太囂張 特種兵痞妃:狂傾天下 腹黑侯爺很難纏 重生之小廚師 長寧 噬源龍魂 異世機鎧士 有座香粉宅 淘氣仙子的美男宮 大明天師 天空日記 我所理解的生活 武林八修
第90章

大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物件!”);

}

}

推薦小說