• 建造(Builder)模式


    【1】基本概念          

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

    【2】简单分析

    我们先来看一下该设计模式的UML结构图


    上图是Strategy 模式的结构图,让我们可以进行更方便的描述:

    • Builder
    为创建一个Product对象的各个部件指定抽象接口。
    • ConcreteBuilder
    实现Builder的接口以构造和装配该产品的各个部件。
    定义并明确它所创建的表示。
    提供一个检索产品的接口
    • Director
    构造一个使用Builder接口的对象。
    • Product
    表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。
    在以下情况使用生成器模式:
    包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
    • 当创建复杂对象(这些对象内部构建间的建造顺序通常是稳定的)的算法应该独立于该对象的组成部分以及它们的装配方式时;
    • 当构造过程必须允许被构造的对象有不同的表示时。

    【3】如何用java语言来实现该模式

    下面以一个简单的例子来展示该模式,先看下代码结构图:


    3.1 先创建一个Product类--产品类:

    [html] view plaincopy
    1. package com.andyidea.patterns.product;  
    2.   
    3. /**  
    4.  * Product--产品类  
    5.  * @author Andy.Chen  
    6.  *  
    7.  */  
    8. public class Pizza {  
    9.       
    10.     private String dough;  
    11.     private String sauce;  
    12.     private String topping;  
    13.       
    14.     public void setDough(String dough) {  
    15.         this.dough = dough;  
    16.     }  
    17.     public void setSauce(String sauce) {  
    18.         this.sauce = sauce;  
    19.     }  
    20.     public void setTopping(String topping) {  
    21.         this.topping = topping;  
    22.     }  
    23.   
    24. }  
    3.2 创建抽象建造者类:PizzaBuilder.java

    [html] view plaincopy
    1. package com.andyidea.patterns.builder;  
    2.   
    3. import com.andyidea.patterns.product.Pizza;  
    4.   
    5. /**  
    6.  * Builder类--抽象建造者类  
    7.  * @author Andy.Chen  
    8.  *  
    9.  */  
    10. public abstract class PizzaBuilder {  
    11.       
    12.     protected Pizza pizza;  
    13.      
    14.     public Pizza getPizza() {   
    15.         return pizza;   
    16.     }  
    17.       
    18.     public void createNewPizzaProduct() {   
    19.         pizza = new Pizza();   
    20.     }  
    21.    
    22.     public abstract void buildDough();  
    23.     public abstract void buildSauce();  
    24.     public abstract void buildTopping();  
    25.   
    26. }  
    3.3 创建具体建造者类

    HawaiianPizzaBuilder.java源码:

    [html] view plaincopy
    1. package com.andyidea.patterns.concretebuilder;  
    2.   
    3. import com.andyidea.patterns.builder.PizzaBuilder;  
    4.   
    5. /**  
    6.  * ConcreteBuilder类--具体建造者类  
    7.  * @author Andy.Chen  
    8.  *  
    9.  */  
    10. public class HawaiianPizzaBuilder extends PizzaBuilder {  
    11.   
    12.     @Override  
    13.     public void buildDough() {  
    14.         System.out.println("Hawaiian-Dough");  
    15.         pizza.setDough("Hawaiian-Dough");  
    16.     }  
    17.   
    18.     @Override  
    19.     public void buildSauce() {  
    20.         System.out.println("Hawaiian-Sauce");  
    21.         pizza.setSauce("Hawaiian-Sauce");  
    22.     }  
    23.   
    24.     @Override  
    25.     public void buildTopping() {  
    26.         System.out.println("Hawaiian-Topping");  
    27.         pizza.setTopping("Hawaiian-Topping");  
    28.     }  
    29.   
    30. }  
    SpicyPizzaBuilder.java源码:

    [html] view plaincopy
    1. package com.andyidea.patterns.concretebuilder;  
    2.   
    3. import com.andyidea.patterns.builder.PizzaBuilder;  
    4.   
    5. /**  
    6.  * ConcreteBuilder类--具体建造者类  
    7.  * @author Andy.Chen  
    8.  *  
    9.  */  
    10. public class SpicyPizzaBuilder extends PizzaBuilder {  
    11.   
    12.     @Override  
    13.     public void buildDough() {  
    14.         System.out.println("Spicy-Dough");  
    15.         pizza.setDough("Spicy-Dough");  
    16.     }  
    17.   
    18.     @Override  
    19.     public void buildSauce() {  
    20.         System.out.println("Spicy-Sauce");  
    21.         pizza.setSauce("Spicy-Sauce");  
    22.     }  
    23.   
    24.     @Override  
    25.     public void buildTopping() {  
    26.         System.out.println("Spicy-Topping");  
    27.         pizza.setTopping("Spicy-Topping");  
    28.     }  
    29.   
    30. }  
    3.4 创建指挥者(Director)类:Waiter.java

    [html] view plaincopy
    1. package com.andyidea.patterns.director;  
    2.   
    3. import com.andyidea.patterns.builder.PizzaBuilder;  
    4. import com.andyidea.patterns.product.Pizza;  
    5.   
    6. /**  
    7.  * Director类--指挥者类  
    8.  * @author Andy.Chen  
    9.  *  
    10.  */  
    11. public class Waiter {  
    12.          
    13.     private PizzaBuilder pizzaBuilder;  
    14.          
    15.     public void setPizzaBuilder (PizzaBuilder pb) {   
    16.         pizzaBuilder = pb;   
    17.     }  
    18.       
    19.     public Pizza getPizza() {   
    20.         return pizzaBuilder.getPizza();   
    21.     }  
    22.        
    23.     public void constructPizza() {  
    24.        pizzaBuilder.createNewPizzaProduct();  
    25.        pizzaBuilder.buildDough();  
    26.        pizzaBuilder.buildSauce();  
    27.        pizzaBuilder.buildTopping();  
    28.     }  
    29. }  
    3.5 测试类:BuilderClient.java

    [html] view plaincopy
    1. package com.andyidea.patterns.client;  
    2.   
    3. import com.andyidea.patterns.builder.PizzaBuilder;  
    4. import com.andyidea.patterns.concretebuilder.HawaiianPizzaBuilder;  
    5. import com.andyidea.patterns.concretebuilder.SpicyPizzaBuilder;  
    6. import com.andyidea.patterns.director.Waiter;  
    7. import com.andyidea.patterns.product.Pizza;  
    8.   
    9. public class BuilderClient {  
    10.   
    11.     public static void main(String[] args) {  
    12.           
    13.         System.out.println("Welcome to Andy.Chen Blog!" +" "   
    14.                    +"Builder Patterns." +" ");  
    15.           
    16.         Waiter waiter = new Waiter();  
    17.         PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();  
    18.         PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder();  
    19.        
    20.         System.out.println("------------HawaiianPizza------------");  
    21.         waiter.setPizzaBuilder(hawaiian_pizzabuilder);  
    22.         waiter.constructPizza();  
    23.           
    24.         System.out.println("------------SpicyPizza------------");  
    25.         waiter.setPizzaBuilder(spicy_pizzabuilder);  
    26.         waiter.constructPizza();  
    27.        
    28.         Pizza pizza = waiter.getPizza();  
    29.     }  
    30. }  
    【4】程序运行结果:

    [html] view plaincopy
    1. Welcome to Andy.Chen Blog!  
    2. Builder Patterns.  
    3.   
    4. ------------HawaiianPizza------------  
    5. Hawaiian-Dough  
    6. Hawaiian-Sauce  
    7. Hawaiian-Topping  
    8. ------------SpicyPizza------------  
    9. Spicy-Dough  
    10. Spicy-Sauce  
    11. Spicy-Topping  
    通过上面我们可以看到:建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
  • 相关阅读:
    拍照
    【HDU 4372】 Count the Buildings (第一类斯特林数)
    【HDU 5370】 Tree Maker(卡特兰数+dp)
    【HDU 4436】 str2int (广义SAM)
    【BZOJ 3926】 [Zjoi2015]诸神眷顾的幻想乡 (广义SAM)
    【HDU 5184】 Brackets (卡特兰数)
    【HDU 1133】 Buy the Ticket (卡特兰数)
    【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)
    【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)
    【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879526.html
Copyright © 2020-2023  润新知