创建型设计模式(5):建造者模式

来源:互联网 发布:智慧云计算 编辑:程序博客网 时间:2024/06/06 02:04
定义
又叫生成器模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

当创建复杂对象的算法应该独立于该对象的组成部分时,而且构造过程必须允许被构造的对象有不同的表示时。我们可以考虑使用建造者模式。

实现

1. Builder为创建一个Product对象的各个部件指定抽象接口。通常包含创建产品和返回产品的抽象方法,也可以是具体方法,把创建过程放到ConcreteBuilder类中。
2. ConcreteBuilder 实现Builder的接口以构造和装配该产品的各个部件。
3. Director负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。
4. Product表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。
/** "Product" */ class Pizza {   private String dough = "";   private String sauce = "";   private String topping = "";    public void setDough (String dough)     { this.dough = dough; }   public void setSauce (String sauce)     { this.sauce = sauce; }   public void setTopping (String topping) { this.topping = topping; } }   ''/** "Abstract Builder" */'' abstract class PizzaBuilder {   protected Pizza pizza;    public Pizza getPizza() { return pizza; }   public void createNewPizzaProduct() { pizza = new Pizza(); }    public abstract void buildDough();   public abstract void buildSauce();   public abstract void buildTopping(); }  /** "ConcreteBuilder" */ class HawaiianPizzaBuilder extends PizzaBuilder {   public void buildDough()   { pizza.setDough("cross"); }   public void buildSauce()   { pizza.setSauce("mild"); }   public void buildTopping() { pizza.setTopping("ham+pineapple"); } }  /** "ConcreteBuilder" */ class SpicyPizzaBuilder extends PizzaBuilder {   public void buildDough()   { pizza.setDough("pan baked"); }   public void buildSauce()   { pizza.setSauce("hot"); }   public void buildTopping() { pizza.setTopping("pepperoni+salami"); } }   ''/** "Director" */'' class Waiter {   private PizzaBuilder pizzaBuilder;    public void setPizzaBuilder (PizzaBuilder pb) { pizzaBuilder = pb; }   public Pizza getPizza() { return pizzaBuilder.getPizza(); }    public void constructPizza() {     pizzaBuilder.createNewPizzaProduct();     pizzaBuilder.buildDough();     pizzaBuilder.buildSauce();     pizzaBuilder.buildTopping();   } }  /** A customer ordering a pizza. */ class BuilderExample {   public static void main(String[] args) {     Waiter waiter = new Waiter();     PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();     PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder();      waiter.setPizzaBuilder ( hawaiian_pizzabuilder );     waiter.constructPizza();      Pizza pizza = waiter.getPizza();   } }

客户创建Director对象,并用它所想要的Builder对象进行配置。Director取得客户的请求创建产品,最后取得产品。

优点
1. 可以对构造对象的过程进行精细的控制,以产生不同的产品对象。
2. 便于扩展,有新的产品时,只需增加新的ConcreteBuilder 就可以实现。

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

参考
http://www.oodesign.com/builder-pattern.html
http://zh.wikipedia.org/wiki/%E7%94%9F%E6%88%90%E5%99%A8%E6%A8%A1%E5%BC%8F