建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
客户端只需指定需要建造的类型,具体建造的过程由建造者类(Director)完成。
建造者模式结构图:
建造者模式主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。由于指挥者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者(ConcreteBuilder)就可以了。
Product 类——产品类,由多个部件组成:
public class Poduct {
private List<String> parts = new ArrayList<String>();
//装配产品部件
public void add(String part) {
parts.add(part);
}
//展示产品
public void show() {
System.out.println("产品部件");
for (String string : parts) {
System.out.println(string);
}
}
}
Builder类——抽象建造者类,确定产品由两个部件 PartA 和 PartB 组成,并声明一个得到产品成品的方法 GetResult。
public interface Builder {
public void builderPartA();
public void builderPartB();
public Poduct getResult();
}
ConcreteBuilder1 类——具体建造者类,决定内容表示。
public class ConcreteBuilder1 implements Builder {
private Poduct poduct = new Poduct();
//选择组件A和组件B
@Override
public void builderPartA() {
poduct.add("PartA");
}
@Override
public void builderPartB() {
poduct.add("PartB");
}
@Override
public Poduct getResult() {
return poduct;
}
}
ConcreteBuilder2 类——具体建造者类:
public class ConcreteBuilder2 implements Builder {
private Poduct poduct = new Poduct();
//选择组件X和组件Y
@Override
public void builderPartA() {
poduct.add("PartX");
}
@Override
public void builderPartB() {
poduct.add("PartY");
}
@Override
public Poduct getResult() {
return poduct;
}
}
Director 类——指挥者类,决定组装的顺序。
public class Director {
public void constructPoduct(Builder builder) {
builder.builderPartA();
builder.builderPartB();
}
}
客户端代码,客户不需要知道具体的建造过程。
public class test {
public static void main(String[] args) {
Director director = new Director();
Builder builder1 = new ConcreteBuilder1();
Builder builder2 = new ConcreteBuilder2();
//用ConcreteBuilder1的方法来建造产品
director.constructPoduct(builder1);
builder1.getResult().show();
//用ConcreteBuilder2的方法来建造产品
director.constructPoduct(builder2);
builder2.getResult().show();
}
}
建造者模式是在 当创建复杂对象的算法应该独立于 该对象的组成部分以及它们的装配方式时 适用的模式