设计模式->BUILDER(生成器)

来源:互联网 发布:喵哥捏脸数据阴阳眼 编辑:程序博客网 时间:2024/05/21 09:53

1   将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2  在以下情况使用B u i l d e r模式
• 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
• 当构造过程必须允许被构造的对象有不同的表示时。


3  结构图



4   代码示例

--~~~~ /** "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 hawaiianPizzaBuilder = new HawaiianPizzaBuilder();        PizzaBuilder spicyPizzaBuilder = new SpicyPizzaBuilder();         waiter.setPizzaBuilder( hawaiianPizzaBuilder );        waiter.constructPizza();         Pizza pizza = waiter.getPizza();         waiter.setPizzaBuilder( spicyPizzaBuilder );        waiter.constructPizza();         Pizza anotherPizza = waiter.getPizza();    } }


5  BUILDER模式优缺点

1 ) 它使你可以改变一个产品的内部表示B u i l d e r对象提供给导向器一个构造产品的抽象
接口。该接口使得生成器可以隐藏这个产品的表示和内部结构。它同时也隐藏了该产品是如
何装配的。因为产品是通过抽象接口构造的,你在改变该产品的内部表示时所要做的只是定
义一个新的生成器。
2) 它将构造代码和表示代码分开B u i l d e r模式通过封装一个复杂对象的创建和表示方式
提高了对象的模块性。客户不需要知道定义产品内部结构的类的所有信息;这些类是不出现
在B u i l d e r接口中的。每个C o n c r e t e B u i l d e r包含了创建和装配一个特定产品的所有代码。这些
代码只需要写一次;然后不同的D i r e c t o r可以复用它以在相同部件集合的基础上构作不同的
P r o d u c t。在前面的RT F例子中,我们可以为RT F格式以外的格式定义一个阅读器,比如一个
S G M L R e a d e r,并使用相同的Te x t C o n v e r t e r生成S G M L文档的A S C I I Te x t、Te X Te x t和
Te x t Wi d g e t译本。
3 ) 它使你可对构造过程进行更精细的控制B u i l d e r模式与一下子就生成产品的创建型模
式不同,它是在导向者的控制下一步一步构造产品的。仅当该产品完成时导向者才从生成器
中取回它。因此B u i l d e r接口相比其他创建型模式能更好的反映产品的构造过程。这使你可以
更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。


原创粉丝点击