[转自恩师wanson]
优点:
1:在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同产品对象
2:每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象,符合开闭原则
3:可以更加精细地控制产品的创建过程
缺点:
1:建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此适用范围受到一定的限制
2:如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。
使用环境:
1:需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员变量
2:需要生成的产品对象的属性相互依赖,需要指定其生成顺序
3:对象创建过程独立于创建该对象的类。
4:隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品
1 package com.shanghai.wangson.designpattern; 2 3 /** 4 * 抽象建造者 5 */ 6 abstract class Builder { 7 /** 8 * 创建产品对象 9 */10 protected Product product=new Product();11 public abstract void builderPartA();12 public abstract void builderPartB();13 public abstract void builderPartC();14 /**15 * 返回产品对象16 */17 public Product getResult(){18 return product;19 }20 21 }
1 package com.shanghai.wangson.designpattern; 2 3 /** 4 * 具体建造者 5 */ 6 public class ConcreteBuilder extends Builder { 7 @Override 8 public void builderPartA() { 9 product.setPartA("建造partA");10 }11 12 @Override13 public void builderPartB() {14 product.setPartB("建造partB");15 }16 17 @Override18 public void builderPartC() {19 product.setPartC("建造partC");20 }21 }
1 package com.shanghai.wangson.designpattern; 2 3 /** 4 * 指挥者 5 */ 6 public class Director { 7 private Builder builder; 8 9 public Director(Builder builder) {10 this.builder = builder;11 }12 /**13 * 产品构建与组装方法14 */15 public Product construct(){16 builder.builderPartA();17 builder.builderPartB();18 builder.builderPartC();19 return builder.getResult();20 }21 }
1 package com.shanghai.wangson.designpattern; 2 3 /** 4 * 产品角色 5 */ 6 public class Product { 7 private String partA; 8 private String partB; 9 private String partC;10 11 public void setPartA(String partA) {12 this.partA = partA;13 }14 15 public void setPartB(String partB) {16 this.partB = partB;17 }18 19 public void setPartC(String partC) {20 this.partC = partC;21 }22 public void show(){23 /**24 * 显示产品的特性25 */26 System.out.println("超微牌子");27 }28 }
1 package com.shanghai.wangson.designpattern; 2 3 public class Driver { 4 public static void main(String[] args) { 5 Builder builder=new ConcreteBuilder(); 6 Director director=new Director(builder); 7 Product product=director.construct(); 8 product.show(); 9 }10 }