1.引入:
工厂模式中创建的对象大都是简单的对象,就像之前举的造斧头的例子,斧头工厂就算造出来石斧,钢斧还是木斧,以及加上联想牌的钢斧或苹果牌石斧等等,说到底都是斧头,都是单一的对象。所以工厂模式就是对单一对象的管理。如果需求是既要创建斧头,又要创建菜刀还要青龙偃月刀呢,那么对于这种复杂的产品类并且拥有不同的属性特点的管理就需要用到建造者模式。
2.什么是建造者模式:
将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的标识。用户只需指定需要创建的类型就得到它们,至于具体建造的过程和细节就不知道了。(书面语)
解释:就是对于斧头和菜刀还是青龙偃月刀,不管你是刀上刻龙还是刀只用来切菜还是砍木头,我只在乎是否拥有 “砍(砍东西)” 的功能。所以就是把斧头和菜刀还有青龙偃月刀的砍东西的功能抽象出来了。也就是说把砍东西的功能构建出来了,那么把拥有砍东西功能的产品可以表示成斧头,菜刀以及青龙偃月刀。(把复杂对象的构建与它的表示分离了,使得拥有同样的构建过程可以创建不同的表示)。
3.实现建造者模式:
3.1.提供产品类:
public class Product {
//为产品添加零件,由于刀和斧头都需要木把(woodenHandle)、铁片(iconSheet),那么木把、铁片都属于产品的零件
public void addPart(String woodenHandle,String iconSheet){
System.out.println("产品已添加了"+woodenHandle);
System.out.println("产品已添加了"+iconSheet);
}
//为产品添加功能
public void addFunction(String function){
System.out.println("产品已具备了"+function+"的功能");
}
}
3.2.提供抽象构建者接口:
//抽象构建者
public interface Builder {
//添加零件建造产品
public void buildProduct();
//砍功能
public void addChop();
//得到产品
public Product getProduct();
}
3.3.实现抽象构建者接口的具体构建者:
public class ConcreteBuilder implements Builder{
private Product product=new Product();
//添加零件建造具体产品
@Override
public void buildProduct() {
// TODO Auto-generated method stub
product.addPart("木把", "铁片");
}
//添加砍功能建造产品
@Override
public void addChop() {
// TODO Auto-generated method stub
product.addFunction("砍东西");
}
//得到产品
public Product getProduct(){
System.out.println("产品造好了,请取!");
return product;
}
}
3.4.实现指挥者,指挥构建者构建产品:
public class Director {
private Builder builder;
public Director(Builder builder){
this.builder=builder;
}
public void produce(){
builder.buildProduct();
builder.addChop();
}
}
3.5.测试类:
public static void main(String[] args) {
// TODO Auto-generated method stub
Builder builder=new ConcreteBuilder();
new Director(builder).produce();
Product product=builder.getProduct();
}
测试结果:
已添加了木把
已添加了铁片
已具备了砍东西的功能
产品造好了,请取!
-------------------------------------------------------------------------------------
整体程序分析:
实际上总体来看,产品类和抽象构建者都没有真正地实现产品,产品添加哪些零件,为产品添加哪些功能都没有实现。真正地实现用户需要的产品是在具体构建者类中实现了。添加木头和铁,拥有砍功能,实际这个是造的斧头还是刀,看似都符合条件。所以建造者模式的特点1是创建一个符合多个条件的对象,而不是像工厂方法模式创建一个具体的对象(如果需要斧头,建造者模式就会创建一个符合斧头特征的对象,而工厂方法模式直接就创建一个斧头类对象)。建造者模式的特点2是把产品所有的功能和特点都集成到了具体构建者中去实现的,至于指挥者只负责指挥具体构建者生产。
----------------------------------------------------------------------------------------------
总结:建造者模式应用时就是把创建复杂对象与对象是由什么组成的及如何装配的完全分开。
图:
创建复杂对象<----------------------------分开-------------------------------->对象组成成分、对象如何装配