Java设计模式——建造者模式
建造者模式(Builder Pattern)属于创建形的设计模式,使用多个简单的对象一步一步构建成一个复杂的对象。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
类图:
代码:
一、建立包装的接口
1 public interface Packing { 2 public String pack(); 3 }
二、建立菜单项的接口
1 public interface Item { 2 public String name(); 3 public Packing packing(); 4 public float price(); 5 }
三、建立实现了包装接口的实体类
1 public class Wrapper implements Packing { 2 3 @Override 4 public String pack() { 5 return "Wrapper"; 6 } 7 8 }
1 public class Bottle implements Packing { 2 3 @Override 4 public String pack() { 5 return "Buttle"; 6 } 7 8 }
四、建立实现菜单项接口的抽象类
1 public abstract class Burger implements Item { 2 3 @Override 4 public Packing packing() { 5 return new Wrapper(); 6 } 7 }
1 public abstract class ColdDrink implements Item { 2 3 @Override 4 public Packing packing() { 5 return new Bottle(); 6 } 7 }
五、建立分别继承抽象类的实体类产品
1 public class ChickenBurger extends Burger { 2 3 @Override 4 public String name() { 5 return "ChickenBurger"; 6 } 7 8 @Override 9 public float price() { 10 return 50.5f; 11 } 12 13 }
1 public class VegBurger extends Burger { 2 3 @Override 4 public String name() { 5 return "VegBurger"; 6 } 7 8 @Override 9 public float price() { 10 return 25.0f; 11 } 12 13 }
1 public class Coke extends ColdDrink { 2 3 @Override 4 public String name() { 5 return "Coke"; 6 } 7 8 @Override 9 public float price() { 10 return 30.0f; 11 } 12 13 }
1 public class Pepsi extends ColdDrink { 2 3 @Override 4 public String name() { 5 return "Pepsi"; 6 } 7 8 @Override 9 public float price() { 10 return 35.0f; 11 } 12 13 }
六、创建菜单类,提供点菜、算账、得到菜名的方法
1 public class Meal { 2 private List<Item> items = new ArrayList<Item>(); 3 4 public void addItems(Item item){ 5 items.add(item); 6 } 7 8 public float getCost(){ 9 float total = 0.0f; 10 for (Item item : items) { 11 total+=item.price(); 12 } 13 return total; 14 } 15 16 public void showItems(){ 17 for (Item item : items) { 18 System.out.print("Item : "+item.name()); 19 System.out.print(", Packing : "+item.packing().pack()); 20 System.out.println(", Price : "+item.price()); 21 } 22 } 23 }
七、建立商品的组合类,负责创建菜单
1 public class MealBuilder { 2 public Meal prepareVegMeal(){ 3 Meal meal = new Meal(); 4 meal.addItems(new VegBurger()); 5 meal.addItems(new Coke()); 6 return meal; 7 } 8 9 public Meal prepareNonVegMeal(){ 10 Meal meal = new Meal(); 11 meal.addItems(new ChickenBurger()); 12 meal.addItems(new Pepsi()); 13 return meal; 14 } 15 }
八、用户,可以选择不同的组合套餐
1 public class BuiderPatternDemo { 2 3 public static void main(String[] args) { 4 MealBuilder mealBuilder = new MealBuilder(); 5 6 Meal meal1 = mealBuilder.prepareNonVegMeal(); 7 meal1.showItems(); 8 9 Meal meal2 = mealBuilder.prepareNonVegMeal(); 10 meal2.showItems(); 11 } 12 13 }