1 /** 2 * 作用: 3 * 将复杂物体的构建与表现相分离。 4 * 組成角色: 5 * 1)建造者(Builder):負責定義用來生成實例的接口(API) 6 * 2)具体的建造者(ConcreateBuilder):负责实现Builder角色定义的接口实现类。 7 * 针对不同的业务逻辑,具体化复杂对象的各部分的创建。在建造完成之后提供产品的实例。 8 * 3)监工(Director):Director角色负责使用Builder角色的接口API来生成实例。内部不涉及具体产品信息,只负责 9 * 保证对象各部分完整创建或按照某种顺序进行创建。即Director是负责指挥如何build的,只负责调度,具体实施交给具体的建造者。 10 * 4)产品(Product):即要创建的复杂对象。 11 * 5)使用者(Client):实际使用Builder模式的角色,即下面的测试类。 12 * 13 * 优缺点: 14 * 封装性:客户端不必知道产品内部组合细节,只需关心我们要生成的某个对象,具体对象产生细节不必知晓。 15 * 建造者独立,易于扩展:案例只列举了ConcreateBuilder建造者类,如果需要其它建造者新建类即可。建造者之间彼此独立,系统扩展性好,符合开闭原则。 16 * 便于控制细节风险:由于具体建造者是独立的,因此可以对具体建造过程中逐步细化,不会对其他模块产生影响。 17 * 18 * 应用场景 19 * 产品类非常复杂,不同的调度产生不同的结果时,使用建造者模式比较适合; 20 * 相同的组件或配件都可以装配到一个对象,但是产生的结果又不相同,可以使用建造者模式。 21 * 22 *建造者模式VS工厂模式 23 * 建造者模式关注零件类型和装配顺序,同为创建型模式,注重点不同。 24 * 工厂模式只有一个建造方法,而建造者有多个建造零件并且强调建造顺序,而工厂模式没有顺序的概念。 25 * 26 * @author mcebgadmin 27 * 28 */
1 //产品类,要建造的对象 2 public class Product { 3 private String ground; 4 private String cement; 5 private String roof; 6 7 public Product() { 8 9 } 10 public String getGround() { 11 return ground; 12 } 13 public void setGround(String ground) { 14 this.ground = ground; 15 } 16 public String getCement() { 17 return cement; 18 } 19 public void setCement(String cement) { 20 this.cement = cement; 21 } 22 public String getRoof() { 23 return roof; 24 } 25 public void setRoof(String roof) { 26 this.roof = roof; 27 } 28 29 } 30 /** 31 * 建造者角色 32 * 33 */ 34 public interface Builder { 35 //一般來說,有多少零配件,就有多少建造方法 36 void buildGround(); 37 void buildCement(); 38 void buildRoof(); 39 40 //返回產品類 41 Product builProduct(); 42 43 } 44 /** 45 * 建造者的實現類 46 * 47 */ 48 public class ConcreteBuilder implements Builder { 49 private final Product product=new Product(); 50 51 @Override 52 public void buildGround() { 53 System.out.println("build地基"); 54 product.setGround("build地基"); 55 } 56 57 @Override 58 public void buildCement() { 59 System.out.println("build水泥"); 60 product.setCement("build水泥"); 61 } 62 63 @Override 64 public void buildRoof() { 65 System.out.println("build樓頂"); 66 product.setRoof("build樓頂"); 67 } 68 69 @Override 70 public Product builProduct() { 71 System.out.println("建造完畢!"); 72 return product; 73 } 74 75 } 76 /** 77 * 監工,負責指揮builder如何建造即如何調度 78 */ 79 public class Director { 80 public Builder builder; 81 public Director(Builder builder) { 82 this.builder=builder; 83 } 84 85 public Product construct() { 86 //構建順序:建造水泥->地基->樓頂 87 builder.buildCement(); 88 builder.buildGround(); 89 builder.buildRoof(); 90 91 return builder.builProduct(); 92 } 93 94 }