zoukankan      html  css  js  c++  java
  • 建造(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 4278 Faulty Odometer 8进制转10进制
    hdu 4740 The Donkey of Gui Zhou bfs
    hdu 4739 Zhuge Liang's Mines 随机化
    hdu 4738 Caocao's Bridges tarjan
    Codeforces Gym 100187M M. Heaviside Function two pointer
    codeforces Gym 100187L L. Ministry of Truth 水题
    Codeforces Gym 100187K K. Perpetuum Mobile 构造
    codeforces Gym 100187J J. Deck Shuffling dfs
    codeforces Gym 100187H H. Mysterious Photos 水题
    windows服务名称不是单个单词的如何启动?
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879526.html
Copyright © 2011-2022 走看看