建造者模式(生成器模式)(10)
建造者模式:将一个复杂对象的构建(指挥者类)和它的表示(测试类)相分离,使得同样的构建过程可以创建不同的表示.
如果我们使用了建造者模式,那么用户只需指定需要建造的类型(具体建造者类的引用,或者其向上转型后的引用)就可以得到它们,而具体的建造过程和细节就不用知道了.
//产品类, 由多个部件组成
public class Product {
private ArrayList<String> parts=new ArrayList<String>();
public void add(String part) {
parts.add(part);
}
public void show() {
System.out.print("展示建造产品所需部件:\n");
for (String part : parts) {
System.out.println(part);
}
}
}
//确定产品由两个部件组成,并声明一个得到产品建造结果的方法
public abstract class Build {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract Product getResult();
}
public class ConcreteBuild1 extends Build{
private Product product=new Product();
//建造具体的部件A
public void buildPartA() {
product.add("PartA");
}
//建造具体的部件B
public void buildPartB() {
product.add("PartB");
}
public Product getResult() {
return product;
}
}
public class ConcreteBuild2 extends Build{
private Product product=new Product();
//建造具体的部件A
public void buildPartA() {
product.add("PartA");
}
//建造具体的部件B
public void buildPartB() {
product.add("PartB");
}
public Product getResult() {
return product;
}
}
//指挥建造过程
public class Director {
public Director(Build build) {
build.buildPartA();
build.buildPartB();
}
}
public class Demo {
public static void main(String[] args) {
Build build1=new ConcreteBuild1();
//Director封装了具体的建造过程
Director director=new Director(build1);
Product product1 = build1.getResult();
product1.show();
Build build2 = new ConcreteBuild2();
Director director2 = new Director(build2);
Product product2 = build2.getResult();
product2.show();
}
}
如果需要细化一些,比如加上产品的PartC,PartD,怎么办呢?这就需要权衡,如果这些细节是每个产品都需要构建的,就需要加进去,反之,没有必要.其实建造者模式是逐步构建产品的,所以建造者Builder类中的方法必须要足够普遍,以便为各种类型的具体建造者构造.
什么时候需要使用建造者模式呢?
它主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序是稳定的,但是对象内部的构建通常面临着复杂的变化
建造者模式的好处?
使得建造代码和表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如果需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了.