NO3-java中設計模式之建造者模式
說明
參考文獻:http://www.runoob.com/design-pattern/builder-pattern.html
上邊的這個菜鳥教程是真的不錯,我也是借花獻佛,只是自己寫了一哈,加上自己的理解和程式碼註釋來分享一下心得吧!免得以後忘了。
建造者模式的理解
建造者模式就是把基礎的,可以隔離出來,具有原子性的元件或者模組隔離開來,然後組裝起來實現多變化,複雜性較高的系統,就像建一棟大樓一樣的,據說現在個把月就可以元件一棟高樓。
專案例項說明
簡單的說就是我們要構建一個智慧的點餐系統,使用者輸入點餐的東西,系統自動給出該套餐的資訊和價格。當然,主要是學習java建造者模式,可以說完全就沒有使用者體驗(暈)。
專案例項
我們假設一個快餐店的商業案例,其中,一個典型的套餐可以是一個漢堡(Burger)和一杯冷飲(Cold drink)。漢堡(Burger)可以是素食漢堡(Veg Burger)或雞肉漢堡(Chicken Burger),它們是包在紙盒中。冷飲(Cold drink)可以是可口可樂(coke)或百事可樂(pepsi),它們是裝在瓶子中。
我們將建立一個表示食物條目(比如漢堡和冷飲)的 Item 介面和實現 Item 介面的實體類,以及一個表示食物包裝的 Packing 介面和實現 Packing介面的實體類,漢堡是包在紙盒中,冷飲是裝在瓶子中。
然後我們建立一個 Meal 類,帶有 Item 的 ArrayList 和一個通過結合 Item 來建立不同型別的 Meal 物件的 MealBuilder。BuilderPatternDemo,我們的演示類使用 MealBuilder 來建立一個 Meal。
專案模式圖
專案目錄
專案程式碼說明(實踐出真知)
建立一個表示食物條目和食物包裝的介面。
package BuildStudy;
public
public String name();
public Packing paking();//是一個介面,需要單獨實現包裝方式的實現類
public float price();
}
package BuildStudy;
public interface Packing {
public String pack();//包裝介面
}
建立實現 Packing 介面的實體類。
package BuildStudy;
public class Wrapper implements Packing{//包裝的實現類,用紙
@Override
public String pack() {
return "Wrapper";
}
}
package BuildStudy;
public class Bottle implements Packing{//包裝的實現類,用瓶子
@Override
public String pack() {
return "Bottle";
}
}
建立實現 Item 介面的抽象類,該類提供了預設的功能。
package BuildStudy;
public abstract class Burger implements Item{//抽象類實現返回包裝類的方法
@Override
public Packing paking() {
return new Wrapper();
}
@Override
public abstract float price();//告訴你這個東西有價格,待定
}
package BuildStudy;
public abstract class ColdDrink implements Item{//抽象類實現返回包裝類的方法
@Override
public Packing paking() {
return new Bottle();
}
@Override
public abstract float price();//告訴你這個東西有價格,待定
}
建立擴充套件了 Burger 和 ColdDrink 的實體類。
package BuildStudy;
public class VegBurger extends Burger{//具體的名字,價格實現類
@Override
public String name() {
return "Veg Burger";
}
@Override
public float price() {
return 25.5f;
}
}
package BuildStudy;
public class ChickenBurger extends Burger {//具體的名字,價格實現類
@Override
public String name() {
return "Chicken Burger";
}
@Override
public float price() {
return 50.5f;
}
}
package BuildStudy;
public class Coke extends ColdDrink {//具體的名字,價格實現類
@Override
public String name() {
return "Coke";
}
@Override
public float price() {
return 30.0f;
}
}
package BuildStudy;
public class Pepsi extends ColdDrink {//具體的名字,價格實現類
@Override
public String name() {
return "Pepsi";
}
@Override
public float price() {
return 35.5f;
}
}
建立一個 Meal 類,帶有上面定義的 Item 物件。
package BuildStudy;
import java.util.ArrayList;
import java.util.List;
/**
* 重點理解一下這裡,因為Meal物件是接收使用者點餐和識別後臺點餐的各種複雜項的中間橋樑
*/
public class Meal {
private List<Item> items = new ArrayList<Item>();//可以理解為裝客戶點餐的順序和商品的動態的列表
public void addItem(Item item){//增加的方法
items.add(item);
}
public float getCost(){//遍歷點餐的樣品來計算價錢
float cost = 0.0f;
for (Item item : items){
cost += item.price();
}
return cost;
}
public void showItems(){//然後展示出來
for (Item item : items){
System.out.println("item :"+item.name());
System.out.println("packing :" +item.paking().pack());
System.out.println("price :"+ item.price());
}
}
}
建立一個 MealBuilder 類,實際的 builder 類負責建立 Meal 物件。
package BuildStudy;
public class MealBuilder {
public Meal prepare (){
Meal meal = new Meal();
meal.addItem(new ChickenBurger());//加一個雞肉漢堡
meal.addItem(new Coke());//加一杯冷飲
meal.addItem(new VegBurger());//加一個素食漢堡
meal.addItem(new Pepsi());//加一個披薩
//可以再點,沒關係,只要有錢
//再加一個雞肉漢堡
meal.addItem(new ChickenBurger());
return meal;
}
}
BuiderPatternDemo 使用 MealBuider 來演示建造者模式(Builder Pattern)。
package BuildStudy;
public class BuilderPatternDemo {
public static void main(String[] args){
MealBuilder mealBuilder = new MealBuilder();
Meal nonVegMeal = mealBuilder.prepare();
System.out.println("你好,您點餐資訊:");
nonVegMeal.showItems();
System.out.println("Total Cost:" +nonVegMeal.getCost());
}
}
輸出為:
相比於專案實現來說,你不用建造者模式又怎麼實現呢? 有沒有更好的呢?