学习了这么多模式,其实回想一下其实也没什么,就是用不同的方式设计代码,保证代码的可扩展性、复用等,稍微对代码进行一下修改就是另外一种模式。在我们工作中其实已经用了很多模式了,只不过不知道或者没留意他叫什么而已,无所谓,只要会用一切都是浮云。
关于<<大话设计模式>>对建造者模式的讲解是以画一个人来作为例子讲解的。人分为高人、矮人、胖人、瘦人等,但都是人,但当你去画一个人的时候,画的过程都是稳定的,都需要画头、身子、手、脚,不同的是建造的细节是不一样的。所以如果你需要将一个复杂的构件与它的表示分离,使得同样的过程可以建造不同的表示,这样的模式就是建造者模式。
好了,我们通过分析代码来解释抽象吧。
1、产品类(也就是例子中的人)、有多个部件组成
public class Product {
private List<String> list = new ArrayList<String>();
//相当于给人画头、手、脚
public void add(String str){
list.add(str);
}
public void show(){
for(String string : list){
System.out.print(string+",");
}
}
}
2、建造者,确定产品有A和B组成
public abstract class Builder {
public abstract void buildPartA();
public abstract void buildPartB();
public abstract Product getResult();
}
3、部件1
public class Build1 extends Builder {
Productproduct = new Product();
@Override
public void buildPartA() {
// TODO Auto-generated method stub
product.add("built part a1");
}
@Override
public void buildPartB() {
// TODO Auto-generated method stub
product.add("built part b1");
}
@Override
public Product getResult() {
// TODO Auto-generated method stub
return product;
}
}
4、部件2
public class Build2 extends Builder {
Productproduct = new Product();
@Override
public void buildPartA() {
// TODO Auto-generated method stub
product.add("built part a2");
}
@Override
public void buildPartB() {
// TODO Auto-generated method stub
product.add("built part b2");
}
@Override
public Product getResult() {
// TODO Auto-generated method stub
return product;
}
}
5、指挥者类(关键,传什么对象建什么对象)
/*
* 指挥者,传递那个对象建造那个对象
*/
public class Director {
public void construct(Builder builder){
//都要建A和B,只不过建的内容不一样而已
builder.buildPartA();
builder.buildPartB();
}
}
6、客户端
public class BuildClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//建造A对象
Builderbuilder = new Build1();
Directordirector = new Director();
director.construct(builder);
Productproduct =builder.getResult();
product.show();
Builderbuilder2 = new Build2();
director.construct(builder2);
product =builder2.getResult();
product.show();
}
}
当我们再增加一个部件的时候我们只需要增加一个部件类并继承Build就可以了,直接在客户端实例化调用即可,因为增加的部件类也有A和B两部分,公共的东西是不变的。
附上建造者模式结构图
总结:建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时使用的模式。建造者模式就是将公共的必须的过程抽出来,保证每次创建都会执行公共的过程,只是具体细节不一样,就像画人一样,都需要画头、手、脚。