建造(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  
通过上面我们可以看到:建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
原文地址:https://www.cnblogs.com/zsw-1993/p/4879527.html