1. 建造者模式概述
应用多个简略对象来结构一个简单的对象。
(1) 实用状况
结构一个简单对象的外部组件不变,然而这些外部组建的组合形式常常变动的时候,能够思考应用建造者模式。
(2) 长处
建造者独立,易扩大
(3) 毛病
- 产品必须有共同点,范畴有限度
- 不适用于外部组件常常产生变动的状况
2. 建造者模式实例
咱们当初要设计一个简略的外卖零碎,零碎中提供各种套餐,套餐中能够蕴含食物和饮料。
(1) 先实现一个Item类,示意所有的食物和饮料的基类,它还实现了Packing接口,这样每个Item就能够进行打包了
public abstract class Item implements Packing { // 物品名称 private String name; // 物品价格 private int price; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; }}
public interface Packing { // 打包 String packing();}
(2) 外卖中能够包含食物Food和饮料Drink,它们都继承于Item类,且实现不同的打包形式
public abstract class Food extends Item implements Box { // 食物是用盒子打包}public abstract class Drink extends Item implements Bottle { // 饮料是用瓶子打包}
(3) 打包形式能够分为盒装和瓶装
public interface Box extends Packing { @Override default String packing() { // 盒装 return "Box"; }}public interface Bottle extends Packing { @Override default String packing() { // 瓶装 return "Bottle"; }}
(4) 实现具体的食物和饮料
public class Rice extends Food { public Rice() { // 米饭价格15元 this.setName("Rice"); this.setPrice(15); }}public class Noodles extends Food{ public Noodles() { // 面条价格12元 this.setName("Noodles"); this.setPrice(12); }}public class Coke extends Drink { public Coke() { // 可乐价格4元 this.setName("Coke"); this.setPrice(4); }}public class Spirit extends Drink { public Spirit() { // 雪碧价格3元 this.setName("Spirit"); this.setPrice(3); }}
(5) 实现套餐类
public class Meal { private List<Item> items = new ArrayList<>(); // 打印套餐总价 public void printCost() { int cost = 0; for (Item item : items) { cost += item.getPrice(); } System.out.println("Cost: " + cost); } // 打印套餐内容 public void printItems() { for (Item item : items) { System.out.print("Item: " + item.getName()); System.out.print(", Packing: " + item.packing()); System.out.println(", Price : " + item.getPrice()); } } // 套餐减少内容 public void addItem(Item item) { this.items.add(item); }}
(6) 实现套餐的建造者类
public class MealBuilder { public Meal buyMeal1() { Meal meal = new Meal(); meal.addItem(new Rice()); meal.addItem(new Coke()); return meal; } public Meal buyMeal2() { Meal meal = new Meal(); meal.addItem(new Noodles()); meal.addItem(new Spirit()); return meal; }}
(7) 点外卖
public class BuilderPatternDemo { public static void main(String[] args) { MealBuilder builder = new MealBuilder(); Meal meal1 = builder.buyMeal1(); meal1.printItems(); meal1.printCost(); Meal meal2 = builder.buyMeal2(); meal2.printItems(); meal2.printCost(); }}
3. 一些思考
这个例子中的简单对象就是套餐,而简略对象就是各种食物和饮料。
它们都是派生自Item类,即都有共同点。
食物和饮料不会常常变动,而套餐却常常会变。
如果须要减少新的套餐,只须要在MealBuilder类中减少套餐即可。
参考援用
建造者模式:http://it028.com/builder-patt...