本文最后编辑于 前,其中的内容可能需要更新。
建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。可以将复杂对象的创建过程独立出来,简化逻辑。
直接从代码感受吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
public interface Item { public String name(); public Packing packing(); public float price(); } public interface Packing { public String pack(); }
public class Wrapper implements Packing { @Override public String pack() { return "Wrapper"; } } public class Bottle implements Packing { @Override public String pack() { return "Bottle"; } }
public abstract class Burger implements Item { @Override public Packing packing() { return new Wrapper(); } } public abstract class ColdDrink implements Item { @Override public Packing packing() { return new Bottle(); } }
public class VegBurger extends Burger { @Override public float price() { return 25.0f; } @Override public String name() { return "Veg Burger"; } } public class ChickenBurger extends Burger { @Override public float price() { return 50.5f; } @Override public String name() { return "Chicken Burger"; } } public class Coke extends ColdDrink { @Override public float price() { return 30.0f; } @Override public String name() { return "Coke"; } } public class Pepsi extends ColdDrink { @Override public float price() { return 35.0f; } @Override public String name() { return "Pepsi"; } }
|
至此,组成几分套餐的基本成分就齐了,接下来我们再定义出套餐类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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.print("Item : "+item.name()); System.out.print(", Packing : "+item.packing().pack()); System.out.println(", Price : "+item.price()); } } }
|
有了套餐元素和套餐类,我们就可以创建一个Builder对象,用于创建各种套餐。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public class MealBuilder { public Meal prepareVegMeal (){ Meal meal = new Meal(); meal.addItem(new VegBurger()); meal.addItem(new Coke()); return meal; } public Meal prepareNonVegMeal (){ Meal meal = new Meal(); meal.addItem(new ChickenBurger()); meal.addItem(new Pepsi()); return meal; } }
public class BuilderPatternDemo { public static void main(String[] args) { MealBuilder mealBuilder = new MealBuilder(); Meal vegMeal = mealBuilder.prepareVegMeal(); System.out.println("Veg Meal"); vegMeal.showItems(); System.out.println("Total Cost: " +vegMeal.getCost()); Meal nonVegMeal = mealBuilder.prepareNonVegMeal(); System.out.println("\n\nNon-Veg Meal"); nonVegMeal.showItems(); System.out.println("Total Cost: " +nonVegMeal.getCost()); } }
|
有时候可能情况会更复杂一些,我们可能会这样定义MealBuilder:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public abstract class MealBuilder { Meal m; public void buildFood(); public void buildDrink(); public Meal getMeal() { return m; } } public class VegMealBuilder implements MealBuilder { @Override public void buildFood() { m..addItem(new VegBurger()); } @Override public void buildDrink() { m..addItem(new Coke()); } } public class NonVegMealBuilder implements MealBuilder { @Override public void buildFood() { m..addItem(new ChickenBurger()); } @Override public void buildDrink() { m..addItem(new Pepsi()); } }
|
为了让各种不同的建造者工作起来,就需要引入监工(Director)角色,通过监工来实现使不同的建造者通过统一的流程创建出不同的产品。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public class MealDirector { MealBuilder builder; MealDirector(MealBuilder b) { this.builder = b; } public void setBuilder(MealBuilder b) { this.builder = b; } public Meal buildMeal() { this.builder.buildFood(); this.builder.buildDrink(); return this.builder.getMeal(); } }
public class BuilderPatternDemo { public static void main(String[] args) { VegMealBuilder b1 = new VegMealBuilder(); NonVegMealBuilder b2 = new NonVegMealBuilder(); MealDirector director = new MealDirector(b1); Meal vegMeal = director.buildMeal(); System.out.println("Veg Meal"); vegMeal.showItems(); System.out.println("Total Cost: " +vegMeal.getCost()); director.setBuilder(b2); Meal nonVegMeal = director.buildMeal(); System.out.println("\n\nNon-Veg Meal"); nonVegMeal.showItems(); System.out.println("Total Cost: " +nonVegMeal.getCost()); } }
|