建造者模式(Builder Pattern)

简介

生成器模式是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

范例

  1. /** "Product" */
  2. class Pizza {
  3. private String dough = "";
  4. private String sauce = "";
  5. private String topping = "";
  6. public void setDough (String dough) { this.dough = dough; }
  7. public void setSauce (String sauce) { this.sauce = sauce; }
  8. public void setTopping (String topping) { this.topping = topping; }
  9. }
  10. ''/** "Abstract Builder" */''
  11. abstract class PizzaBuilder {
  12. protected Pizza pizza;
  13. public Pizza getPizza() { return pizza; }
  14. public void createNewPizzaProduct() { pizza = new Pizza(); }
  15. public abstract void buildDough();
  16. public abstract void buildSauce();
  17. public abstract void buildTopping();
  18. }
  19. /** "ConcreteBuilder" */
  20. class HawaiianPizzaBuilder extends PizzaBuilder {
  21. public void buildDough() { pizza.setDough("cross"); }
  22. public void buildSauce() { pizza.setSauce("mild"); }
  23. public void buildTopping() { pizza.setTopping("ham+pineapple"); }
  24. }
  25. /** "ConcreteBuilder" */
  26. class SpicyPizzaBuilder extends PizzaBuilder {
  27. public void buildDough() { pizza.setDough("pan baked"); }
  28. public void buildSauce() { pizza.setSauce("hot"); }
  29. public void buildTopping() { pizza.setTopping("pepperoni+salami"); }
  30. }
  31. ''/** "Director" */''
  32. class Waiter {
  33. private PizzaBuilder pizzaBuilder;
  34. public void setPizzaBuilder (PizzaBuilder pb) { pizzaBuilder = pb; }
  35. public Pizza getPizza() { return pizzaBuilder.getPizza(); }
  36. public void constructPizza() {
  37. pizzaBuilder.createNewPizzaProduct();
  38. pizzaBuilder.buildDough();
  39. pizzaBuilder.buildSauce();
  40. pizzaBuilder.buildTopping();
  41. }
  42. }
  43. /** A customer ordering a pizza. */
  44. class BuilderExample {
  45. public static void main(String[] args) {
  46. Waiter waiter = new Waiter();
  47. PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();
  48. PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder();
  49. waiter.setPizzaBuilder ( hawaiian_pizzabuilder );
  50. waiter.constructPizza();
  51. Pizza pizza = waiter.getPizza();
  52. }
  53. }

抽象工厂模式与生成器相似,因为它也可以创建复杂对象。主要的区别是生成器模式着重于一步步构造一个复杂对象。而抽象工厂模式着重于多个系列的产品对象(简单的或是复杂的)。生成器在最后的一步返回产品,而对于抽象工厂来说,产品是立即返回的。

实例

建造者模式包含如下角色:

  • Builder:抽象建造者
  • ConcreteBuilder:具体建造者
  • Director:指挥者
  • Product:产品角色

builder

实序图

builder

建造者模式主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序是稳定的,但是对象内部的构建通常面临着复杂的变化。

建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了改产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。