Java Builder Pattern(建造者模式)

建造者模式(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ù)雜,會有很多的建造類。

  1. 創(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();
}
  1. 創(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";
    }

}
  1. 創(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();
}
  1. 創(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;
    }

}
  1. 創(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;
    }

}
  1. 創(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;
        }
    }
}
  1. 主函數(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容