建造者模式(Builder Pattern)使用多個簡單的對象一步一步構(gòu)建成一個復(fù)雜的對象。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。
一個 Builder 類會一步一步構(gòu)造最終的對象。該 Builder 類是獨(dú)立于其他對象的。
優(yōu)點(diǎn): 1、建造者獨(dú)立,易擴(kuò)展。 2、便于控制細(xì)節(jié)風(fēng)險。
缺點(diǎn): 1、產(chǎn)品必須有共同點(diǎn),范圍有限制。 2、如內(nèi)部變化復(fù)雜,會有很多的建造類。
- 創(chuàng)建一個表示食物條目和食物包裝的接口。
/**
* 1. 創(chuàng)建一個表示食物條目和食物包裝的接口。
* @author mazaiting
*/
public interface Item {
/**
* 名稱
* @return
*/
public String name();
/**
* 包裝
* @return
*/
public Packing packing();
/**
* 價格
* @return
*/
public float price();
}
/**
* 1. 包裝接口
* @author mazaiting
*/
public interface Packing {
/**
* 包裝
* @return
*/
public String pack();
}
- 創(chuàng)建實(shí)現(xiàn) Packing 接口的實(shí)體類。
/**
* 2. 創(chuàng)建實(shí)現(xiàn) Packing 接口的實(shí)體類。
* @author mazaiting
*/
public class Bottle implements Packing{
public String pack() {
return "Bottle";
}
}
/**
* 2. 創(chuàng)建實(shí)現(xiàn) Packing 接口的實(shí)體類。
* @author mazaiting
*/
public class Wrapper implements Packing {
public String pack() {
return "Wrapper";
}
}
- 創(chuàng)建實(shí)現(xiàn) Item 接口的抽象類,該類提供了默認(rèn)的功能。
/**
* 3. 創(chuàng)建實(shí)現(xiàn) Item 接口的抽象類,該類提供了默認(rèn)的功能。
* @author mazaiting
*/
public abstract class Burger implements Item{
public Packing packing() {
return new Wrapper();
}
public abstract float price();
}
/**
* 3. 創(chuàng)建實(shí)現(xiàn) Item 接口的抽象類,該類提供了默認(rèn)的功能。
* @author mazaiting
*/
public abstract class Drink implements Item{
public Packing packing() {
return new Bottle();
}
public abstract float price();
}
- 創(chuàng)建擴(kuò)展了 Burger的實(shí)體類。
/**
* 4. 創(chuàng)建擴(kuò)展了 Burger的實(shí)體類。
* @author mazaiting
*
*/
public class ChickenBurger extends Burger{
public String name() {
return "Chicken Burger";
}
@Override
public float price() {
return 50.5f;
}
}
/**
* 4. 創(chuàng)建擴(kuò)展了 Burger的實(shí)體類。
* @author mazaiting
*/
public class VegBurger extends Burger{
public String name() {
return "Veg Burger";
}
@Override
public float price() {
return 25.0f;
}
}
- 創(chuàng)建擴(kuò)展了 ColdDrink 的實(shí)體類。
/**
* 5. 創(chuàng)建擴(kuò)展了 ColdDrink 的實(shí)體類。
* @author mazaiting
*/
public class CokeDrink extends Drink{
public String name() {
return "Coke";
}
@Override
public float price() {
return 30.0f;
}
}
/**
* 5. 創(chuàng)建擴(kuò)展了ColdDrink 的實(shí)體類。
* @author mazaiting
*/
public class PepsiDrink extends Drink{
public String name() {
return "Pepsi";
}
@Override
public float price() {
return 35.0f;
}
}
- 創(chuàng)建一個 Meal 類,帶有上面定義的 Item 對象。創(chuàng)建一個 MealBuilder 類,實(shí)際的 builder 類負(fù)責(zé)創(chuàng)建 Meal 對象。
/**
* 6. 創(chuàng)建一個 Meal 類,帶有上面定義的 Item 對象。
* @author mazaiting
*/
public class Meal {
private List<Item> items = new ArrayList<Item>();
/**
* 添加條目
* @param item
*/
private void addItem(Item item) {
items.add(item);
}
/**
* 獲取總價格
* @return
*/
public float getCost() {
float cost = 0.0f;
for (Item item : items) {
cost += item.price();
}
return cost;
}
/**
* 顯示條目詳細(xì)信息
*/
public void showItems() {
for (Item item : items) {
System.out.print("Item : "+item.name());
System.out.print(", Packing : "+item.packing().pack());
System.out.println(", Price : "+item.price());
}
}
/**
* 創(chuàng)建一個 MealBuilder 類,實(shí)際的 builder 類負(fù)責(zé)創(chuàng)建 Meal 對象。
* @author mazaiting
*/
public static class MealBuilder{
private Meal mMeal = null;
public MealBuilder(){
mMeal = new Meal();
}
public MealBuilder prepareVegMeal() {
mMeal.addItem(new VegBurger());
mMeal.addItem(new CokeDrink());
return this;
}
public MealBuilder prepareNonVegMeal() {
mMeal.addItem(new ChickenBurger());
mMeal.addItem(new PepsiDrink());
return this;
}
public Meal show() {
return mMeal;
}
}
}
- 主函數(shù)調(diào)用
/**
* 7. 客戶端驗(yàn)證
* @author mazaiting
*/
public class Client {
public static void main(String[] args) {
// 創(chuàng)建Meal對象, 鏈?zhǔn)讲シ? Meal meal = new Meal.MealBuilder()
.prepareVegMeal()
.prepareNonVegMeal()
.show();
// 顯示條目
meal.showItems();
System.out.println("-----------------------");
// 打印價格
System.out.println("總價: " + meal.getCost());
}
}
打印結(jié)果:
Item : Veg Burger, Packing : Wrapper, Price : 25.0
Item : Coke, Packing : Bottle, Price : 30.0
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
-----------------------
總價: 140.5