定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
优点
建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。
其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。
建造者模式与工厂模式对比
建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。
一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式。
Product.java
public class Product {
private String name;
private String type;
private String file;
@Override
public String toString() {
return "Product{" +
"name='" + name + '\'' +
", type='" + type + '\'' +
", file='" + file + '\'' +
'}';
}
public void setName(String name) {
this.name = name;
}
public void setType(String type) {
this.type = type;
}
public void setFile(String file) {
this.file = file;
}
}
Builder.java
public interface Builder {
void setPartA(String arg1, String arg2);
void setPartB(String arg1,String arg2,String arg3);
Product getProduct();
}
ConcreteBuilder.java
public class ConcreteBuilder implements Builder {
Product product = new Product();
@Override
public void setPartA(String arg1, String arg2) {
product.setName(arg1);
product.setType(arg2);
}
@Override
public void setPartB(String arg1, String arg2, String arg3) {
product.setName(arg1);
product.setType(arg2);
product.setFile(arg3);
}
@Override
public Product getProduct() {
return product;
}
}
Director.java
public class Director {
Builder builder = new ConcreteBuilder();
public Product getAProduct(){
builder.setPartA("宝马","x1");
return builder.getProduct();
}
public Product getBProduct(){
builder.setPartB("宝马","x2","zhangyu");
return builder.getProduct();
}
}
main.java
public void main(){
System.out.println("你好");
Director director = new Director();
Product aProduct = director.getAProduct();
System.out.println(aProduct);
Product bProduct = director.getBProduct();
System.out.println(bProduct);
}
测试结果
Product{name='宝马', type='x1', file='null'}
Product{name='宝马', type='x2', file='zhangyu'}