建造者模式:又叫生成器模式,可以将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示。
建造者模式可以将一个产品内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们使用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到他们,而具体的建造过程和细节就不需要知道了。
建造者模式(Builder)有几个重要的组成部分:
建造者(Builder):为创建一个Product对象的各个部件指定的抽象接口,拥有建造方法,这些建造方法必须足够普遍,以便为各种类型的具体建造者构造。
具体建造者(ConcreteBuilder):实现Builder接口,构造和装配各个部件。
产品类(Product):具体的产品角色。
指挥者(Director):根据用户的需求构建一个使用Builder接口的对象。用来控制建造过程,也用它来隔离用户与建造过程的关联。
建造者模式代码解析:
Product类——产品类,由多个部件组成。
public class Product {
private List<String> parts = new ArrayList<>();
public void add(String part){
parts.add(part);
}
public void show(){
parts.forEach(System.out::println);
}
}
Builder类——抽象建造者类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后结果的getResult方法。
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
/**
* 获取建造结果
* @return
*/
public abstract Product getResult();
}
ConcreteBuilder1类——具体建造者类。
public class ConcreteBuilder1 extends Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.add("部件A");
}
@Override
public void buildPartB() {
product.add("部件B");
}
@Override
public Product getResult() {
return product;
}
}
ConcreteBuilder2类——具体建造者类。
public class ConcreteBuilder2 extends Builder {
private Product product = new Product();
@Override
public void buildPartA() {
product.add("部件X");
}
@Override
public void buildPartB() {
product.add("部件Y");
}
@Override
public Product getResult() {
return product;
}
}
Director类——指挥类,用来确定构造过程。
public class Director {
public void construct(Builder builder){
builder.buildPartA();
builder.buildPartB();
}
}
客户端代码,客户不需要知道具体的建造过程。
public class BuilderTest {
public static void main(String[] args) {
Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
// 指挥者用 ConcreteBuilder1 的方法来建造产品
director.construct(b1);
Product p1 = b1.getResult();
System.out.println("产品1");
p1.show();
// 指挥者用 ConcreteBuilder2 的方法来建造产品
director.construct(b2);
Product p2 = b2.getResult();
System.out.println("产品2");
p2.show();
}
}
输出结果:
产品1
部件A
部件B
产品2
部件X
部件Y
什么时候用:
建造者模式主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造类就可以了。
总结:
建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式。也就是说,流程相同,实现细节不同时使用。