建造者模式
1 建造者模式特点:
建造者模式可以将一个产品的内部对象与产品的生成过程分割开,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
2 产品内部表象:
一个产品常有不同的组成成分做为产品的零件,这些零件有可能是对象,也有可能不是对象,它们通常叫做产品的内部表象。不同的产品可以有不同的内部表象,也就是不同的零件。建造者模式可以使客户端不需要知道所生成的产品对象有哪些零件,每个产品对应的零件彼此有何不同,是怎么建造出来的,以及怎样组成产品的。
3 简略类图: 略
4 建造者模式的角色:
4.1 抽象建造者(Builder):给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。
4.2 具体建造者(Concrete Builder):与应用程序紧密相关的一些类,它们调用创建产品的实例。该角色的主要任务包括:
1、 实现抽象建造者(Builder)的接口,给出一步一步地完成创建产品实例的操作。
2、 在建造过程完成后,提供产品的实例。
4.3 导演者(Director):调用具体的建造者(Concrete Builder)以创建产品对象,该角色没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者(Concrete Builder)。该角色的与客户端打交道,并且把客户端的创建产品的请求划分为对各个零件的建造请求,然后在把这些请求委派给具体的建造者角色。
4.4 产品(Product):建造中的复杂对象。
5 源码实现:
5.1 导演者(Director):
package org.pattern.builder;
public class Director {
private Builder builder;
/*
* 产品构造方法,负责调用各个零件的建造方法;提供给客户端的主要接口
*/
public void construct(){
builder=new ConcreteBuilder();
builder.buildPart1();
builder.buildPart2();
builder.retrieveResult();
}
}
5.2 具体建造者(Concrete Builder):
package org.pattern.builder;
public class ConcreteBuilder extends Builder {
private Product product;
@Override
public void buildPart1() {
}
@Override
public void buildPart2() {
}
@Override
public Product retrieveResult() {
return product;
}
}
}
5.3 抽象建造者(Builder):
package org.pattern.builder;
public abstract class Builder {
/*
* 产品零件构造方法
*/
public abstract void buildPart1();
/*
* 产品零件构造方法
*/
public abstract void buildPart2();
/*
* 产品返回方法
*/
public abstract Product retrieveResult();
}
5.4 产品(Product):
package org.pattern.builder;
public class Product {
}
6 在什么情况下使用建造模式
6.1 需要生成的产品对象有复杂的内部结构。每一个内部成分本身可以是一个对象,也可以仅仅是一个对象(产品对象)的一个组成部分。
6.2 需要生成的产品对象的属性相互依赖。
6.3 对象的创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。
7 与抽象工厂模式区别
抽象工厂模式中,每次工厂对象被调用都返回一个完整的产品对象,而客户端有可能决定把这些产品组成一个更大更复杂的产品,也有可能不会。构造类是一点点的建造出一个复杂的产品,这个产品的组装过程发生在构造者的内部。建造者模式的客户端拿到的是一个完整的最后产品。也就是说,建造者模式处于更加宏观的尺度上,而抽象工厂模式出在更加具体的尺度。
一个系统的客户端可以通过调用建造角色,间接地调用抽象工厂模式的工厂角色,工厂模式返回不同的产品族的零件,而建造者模式把它们组装起来。