每日上班地铁看一个设计模式
建造者模式定义
建造者模式,也叫生成器模式,定义如下:
将一个复杂对象好的构建与它的表示分离,使同样的构建过程可以创建不同的表示。
建造者模式通用类图:
在建造者模式中,有如下四个角色:
- product产品类
建造者需要建造的产品 - Builder抽象构建者
规范产品的组建,一般由子类实现 - ConcreteBuilder具体构建者
实现抽象定义的所有方法,并返回一个组建好的对象。 - Director导演类
负责安排已有模块的顺序,然后高速builder开始构建。
建造者模式的通用源码,
Product类,通常它是一个组合或继承(如模版方法模式)产生的类:
public class Product {
public void doSomthing(){
//独立业务处理
}
}
抽象建造者:
public abstract class Builder {
//设置产品不通的部分,以获得不同产品
public abstract void setPart();
//建造产品
public abstract Product buildProduct();
}
其中,setPart方法是对象零件的配置,什么是零件?一个对象,获得不同的零件或者不同的装配顺序就能产生不通的产品。
具体建造者代码:
public class ConcreteProduct extends Builder {
private Product product = new Product();
//设置产品零件
public void setPart() {
//产品零件装配
}
//组建一个产品
public Product buildProduct() {
return product;
}
}
需要注意的是,如果有多个产品类就有几个具体的建造者,各个建造者负责具体产品的构建,而且多个产品类具有相同接口或抽象类。
导演类代码:
public class Director() {
private BUilder builder = new ConcreteProduct();
//构建不通产品
public Product getAProduct() {
//设置不通零件,产生固定产品
builder.setPart();
return builder.buildProduct();
}
public Product getBProduct() {
//设置零件
builder.setPart();
return builder.buildProduct();
}
}
导演类起封装的作用,避免高层模块深入到建造者内部的实现类,把复杂的构建封装起来,外部只需要根据相应的方法获取产品。当然,在建造者模式比较庞大时,导演类可以是多个。
建造者模式的应用
建造者模式的优点
- 封装性
使用建造者模式可以使客户端不必知道产品内部组成的细节 - 建造者独立,容易扩展
- 便于控制细节风险
由于建造者是独立的,因此可以对建造过程逐步细化,而不对其他模块产生任何影响。
参考书籍:《设计模式之禅》