1.简介
概念:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
概念图
建造者模式四大要素:
Dirextor: 指挥者类,负责调用适当的建造者来组建产品,用于统一组装流程。
Builder:抽象Builder类,引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。规范产品的组建,一般是由子类实现。
ConcreteBulider: 抽象Builder类的实现类,实现抽象Builder类定义的所有方法,并且返回一个组建好的对象。具体来说一般是两项任务:组建产品;返回组建好的产品。
Product: 产品类,一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量
2.示例
class Product {
private String name;
private String type;
public void showProduct(){
System.out.println("名称:"+name);
System.out.println("型号:"+type);
}
public void setName(String name) {
this.name = name;
}
public void setType(String type) {
this.type = type;
}
}
abstract class Builder {
public abstract void setPart(String arg1, String arg2);
public abstract Product getProduct();
}
class ConcreteBuilder extends Builder {
private Product product = new Product();
public Product getProduct() {
return product;
}
public void setPart(String arg1, String arg2) {
product.setName(arg1);
product.setType(arg2);
}
}
public class Director {
private Builder builder = new ConcreteBuilder();
public Product getAProduct(){
builder.setPart("统一","lc");
return builder.getProduct();
}
public Product getBProduct(){
builder.setPart("康师傅","nrm");
return builder.getProduct();
}
}
public class Client {
public static void main(String[] args){
Director director = new Director();
Product product1 = director.getAProduct();
product1.showProduct();
Product product2 = director.getBProduct();
product2.showProduct();
}
}
使用场景
a.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
b.相同的方法,不同的执行顺序,产生不同的事件结果时。
c.多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
d.产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。
e.创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。
优缺点
优点:
a.使用建造者模式可以使客户端不必知道产品内部组成的细节。
b.具体的建造者类之间是相互独立的,容易扩展。
c.由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
缺点:
a.产生多余的Build对象以及Dirextor类。
总结
建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。
建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。