1. 程式人生 > >NO3-java中設計模式之建造者模式

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 物件的 MealBuilderBuilderPatternDemo,我們的演示類使用 MealBuilder 來建立一個 Meal

專案模式圖

專案目錄

 

專案程式碼說明(實踐出真知)

建立一個表示食物條目和食物包裝的介面。

package BuildStudy;

public

 interface Item {//選單項,包括商品name,包裝方式paking和商品價格

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());

}

}

 

輸出為:

 

相比於專案實現來說,你不用建造者模式又怎麼實現呢? 有沒有更好的呢?