建造模式将一个产品的内部表象与产品的生成过程分割开来,从而使一个建造过程可以生成具有不同内部表象的产品对象。
1> 一个对象的某些属性必须按照某些顺序赋值才有意义,对象的某些属性必须赋值才能使用;
2> 对象由多个零件构成,而零件的构造过程又较为复杂,这时建造模式就很适用。
上面的类图中还需要加上一个Client,由Client生成不同的ConcratedBuilder并调用Director,在Director中使用不同的ConcratedBuilder生成具体的产品。
public Class Client{ public void buildProduct(){ Director director = new Director(); Builder builder1 = new ConcratedBuilder1(); Product p1 = director.construct(builder1); Builder builder2 = new ConcratedBuilder2(); Product p1 = director.construct(builder2); } }
public class Director {
public Product construct(Builder builder){
builder.buildPart1();
builder.buildPart2();
builder.retrieveProduct();
}
}
Director不知道调用哪个ConcreteBuilder生成对象,是由client调用construct方法传入ConcreteBuilder的。
public interface Builder { public abstract Object buildPart1(); public abstract Object buildPart2(); public abstract Product retrieveProduct(); }
public class ConcreteBuilder1 implements Builder {
private Object part1,part2;
@Override
public Object buildPart1() {
part1 = new Object();
return part1;
}
@Override
public Object buildPart2() {
part2 = new Object();
return part2;
}
@Override
public Product retrieveProduct() {
Product1 p = new Product1();
return p;
}
}
public interface Product { public abstract void function(); }
public class Product1 implements Product { @Override public void function() { } }
上面的类之间调用关系的流程图如下所示:
只有1个具体的builder和product时,上面的建造模式可以简化如下:
Builder兼任了Director和Builder双重的作用,直接生成具体的产品。
public class Builder { private Object part1,part2; public Object buildPart1() { part1 = new Object(); return part1; } public Object buildPart2() { part2 = new Object(); return part2; } public Product retrieveProduct() { Product1 p = new Product1(); return p; }
public Product construct(Builder builder){
builder.buildPart1();
builder.buildPart2();
builder.retrieveProduct();
}
}
上面的简化了的建造模式还适用于女娲造人,类图如下:
发送邮件也可以使用建造模式来实现,类图如下:
建造模式与抽象工厂模式的区别:
抽象工厂模式每次都直接生成一个完整的对象,而建造模式生成对象是一步步的,最后返回给客户端的是一个复杂的完整的对象。
建造模式与策略模式的区别:
建造模式的多个具体builder虽然拥有相同的接口,但是所创造的出的对象可能完全不同,只是最后返回的具体对象的一部分。策略模式 是为算法提供抽象的接口。不同的具体策略对象为一般性的服务提供不同的实现。