构建者模式

  建造者模式将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象
角色
抽象建造者(Builder):给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于程序的商业逻辑。模式中直接创建产品对象的是具体建造者角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法,另一种是结果返回方法
一般来说产品包含的零件数目与建造方法的数目相符。有多少零件,就应有多少相应的建造方法
具体建造者:这些是与应用程序紧密相关的一些类,这个角色要完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出一步一步完成创建产品实例的操作。2.在建造过程完成后,提供产品的实例
导演者角色:担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。
产品角色:产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不是一定有共同的接口,而完全可以是不相关联的。
 
导演者角色是与客户打交道的角色,导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但是却不为客户端所知。
 
在什么情况下使用建造者模式:
1.需要生成的产品对象有复杂的内部结构。每一个内部成分本身可以是对象,也可以仅仅是一个对象的一个组成成分
2.需要生成的产品对象的属性相互依赖。建造模式可以强制实行一种分步骤进行的建造过程。因此,如果产品对象 的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式便是一个很好的设计思想。
3.在对象创建过程 中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。
同时使用建造者模式主要有以下效果:
1.建造模式的使用使得产品的内部表象可以独立地变化。使用建造模式可以使客户端不必知道产品内部组成的细节
2.每一个Builder都相对独立,而与其他的Builder无关
3.模式所建造的最终产品更易于控制。
下面是建造两个产品的类图:
简单的代码示意:
  1 public class BuilderTest {
  2 
  3     /**
  4      * 客户端只需要知道导演者,隐藏了产品创建的细节
  5      */
  6     public static void main(String[] args) {
  7         Director director = new Director();
  8         //构建产品1
  9         director.constructProduct1();
 10         //构建产品2
 11         director.constructProduct2();
 12     }
 13 
 14 }
 15 //抽象构建者
 16 abstract class Builder{
 17     //产品零件建造方法
 18     public abstract void buildPart1();
 19     
 20     public abstract void buildPart2();
 21     //产品返还方法
 22     public abstract Product retriveResult();
 23 }
 24 
 25 //第一个具体构造者
 26 class ConcreteBuilder1 extends Builder{
 27     
 28     private Product1 product = new Product1();
 29     @Override
 30     public void buildPart1() {
 31         System.out.println("构建产品1部件1成功");
 32     }
 33 
 34     @Override
 35     public void buildPart2() {
 36         System.out.println("构建产品1部件2成功");
 37     }
 38 
 39     @Override
 40     public Product retriveResult() {
 41         return product;
 42     }
 43     
 44 }
 45 
 46 //第二个具体构造者
 47 class ConcreteBuilder2 extends Builder{
 48     
 49     private Product2 product = new Product2();
 50     @Override
 51     public void buildPart1() {
 52         System.out.println("构建产品2部件1成功");
 53     }
 54 
 55     @Override
 56     public void buildPart2() {
 57         System.out.println("构建产品2部件2成功");
 58     }
 59 
 60     @Override
 61     public Product retriveResult() {
 62         return product;
 63     }
 64 }
 65 
 66 //标识接口,两个产品类的共同接口
 67 interface Product{}
 68 
 69 //产品类1
 70 class Product1 implements Product{
 71     public Product1(){
 72         
 73     }
 74 }
 75 
 76 //产品类2
 77 class Product2 implements Product{
 78     public Product2(){
 79         
 80     }
 81 }
 82 //导演角色
 83 class Director{
 84     private Builder builder;
 85     
 86     public Director(){
 87         
 88     }
 89     
 90     //产品构造方法,负责调用各个零件建造方法
 91     public Product constructProduct1(){
 92         builder = new ConcreteBuilder1();
 93         builder.buildPart1();
 94         builder.buildPart2();
 95         return builder.retriveResult();
 96     }
 97     public Product constructProduct2(){
 98         builder = new ConcreteBuilder2();
 99         builder.buildPart1();
100         builder.buildPart2();
101         return builder.retriveResult();
102     }
103 }
原文地址:https://www.cnblogs.com/wn398/p/3219222.html