建造者模式将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象
角色:
抽象建造者(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 }