设计模式—建造者模式
1 建造者模式
将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者返回给客户一个完整的产品对象,而客户端无须关心该对象所包含的属性和组建方式,这就是建造者模式的设计动机。
2 模式解析
建造者模式通常包括下面几个角色:
1. builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。
2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。
3. Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
4. Product:要创建的复杂对象。
1. public class Meal { 2. private String food; 3. private String drink; 4. 5. public String getFood() { 6. return food; 7. } 8. 9. public void setFood(String food) { 10. this.food = food; 11. } 12. 13. public String getDrink() { 14. return drink; 15. } 16. 17. public void setDrink(String drink) { 18. this.drink = drink; 19. } 20. } 1. public abstract class MealBuilder { 2. Meal meal = new Meal(); 3. 4. public abstract void buildFood(); 5. 6. public abstract void buildDrink(); 7. 8. public Meal getMeal(){ 9. return meal; 10. } 11. } 1. public class MealA extends MealBuilder{ 2. 3. public void buildDrink() { 4. meal.setDrink("一杯可乐"); 5. } 6. 7. public void buildFood() { 8. meal.setFood("一盒薯条"); 9. } 10. 11. } 1. public class MealB extends MealBuilder{ 2. 3. public void buildDrink() { 4. meal.setDrink("一杯柠檬果汁"); 5. } 6. 7. public void buildFood() { 8. meal.setFood("三个鸡翅"); 9. } 10. 11. } 1. public class KFCWaiter { 2. private MealBuilder mealBuilder; 3. 4. public void setMealBuilder(MealBuilder mealBuilder) { 5. this.mealBuilder = mealBuilder; 6. } 7. 8. public Meal construct(){ 9. //准备食物 10. mealBuilder.buildFood(); 11. //准备饮料 12. mealBuilder.buildDrink(); 13. 14. //准备完毕,返回一个完整的套餐给客户 15. return mealBuilder.getMeal(); 16. } 17. } 1. public class Client { 2. public static void main(String[] args) { 3. //服务员 4. KFCWaiter waiter = new KFCWaiter(); 5. //套餐A 6. MealA a = new MealA(); 7. //服务员准备套餐A 8. waiter.setMealBuilder(a); 9. //获得套餐 10. Meal mealA = waiter.construct(); 11. 12. System.out.print("套餐A的组成部分:"); 13. System.out.println(mealA.getFood()+"---"+mealA.getDrink()); 14. } 15. }
3 模式优缺点
3.1 优点
3.1.1 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,使得我们能够更加精确的控制复杂对象的产生过程。
3.1.2 将产品的创建过程与产品本身分离开来,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
3.1.3 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
3.2 缺点
3.2.1 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
3.2.2 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
4 模式适用场景
4.1 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
4.2 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
5 模式总结
5.1 建造者模式是将一个复杂对象的创建过程给封装起来,客户只需要知道可以利用对象名或者类型就能够得到一个完整的对象实例,而不需要关心对象的具体创建过程。
5.2 建造者模式将对象的创建过程与对象本身隔离开了,使得细节依赖于抽象,符合依赖倒置原则。可以使用相同的创建过程来创建不同的产品对象。