2.5 建造者模式
定义:
Builder Pattern,也叫生成器模式
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
优点:
- 封装性
客户端不用知道产品内部的组成细节,直接调用Director类得到具体产品
- 建造者独立,容易扩展
- 便于控制细节风险
使用场景:
- 相同的方法,不同的执行顺序,产生不同的事件结果时,可采用
- 多个部件或零件,都可以装配到一个对象中,但产生的运行结果不同时,可采用
- 产品非常复杂,或产品类中的调用顺序不同产生了不同的效能,可采用
- 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品的创建过程中不易得到,可采用。
这个场景只能是一个补偿方法,因为一个对象不易获得,在设计阶段竟然没有发觉,而需要通过创建模式柔化创建过程,本身已经违反了设计的最初目标。
注意:
- 建造者模式关注的是零件的类型和装配工艺(顺序),这是它与工厂方法模式最大的不同,虽同为创建类模式,但侧重点不同。
- 与建造者模式相比,工厂方法模式侧重于创建,创建零件是它的主要职责,组装顺序不是它关心的
- 创建者模式中的零件[setPart()会安排零件顺序]:零件组装顺序不同对象效能也不同,实现效能的方法[如汽车组装后的运行方法run()]可引入模板方法模式
- 使用建造者模式的时候考虑下模板方法模式,不要孤立地思考一个模式。
代码:
/**
* ❉ ❉ ❉ ❉ ❉ 产品 ❉ ❉ ❉ ❉ ❉
*/
class Product{
public void doSomething(){}
}
/*
* 抽象建造者
*/
abstract class Builder{
//设置产品的不同部分,以获得不同的产品
public abstract void setPart();
//建造产品
public abstract Product buildProduct();
}
/**
* ❉ ❉ ❉ ❉ ❉ 具体建造者 ❉ ❉ ❉ ❉ ❉
*/
class ConcreateBuilder extends Builder{
private Product pro = new Product();
//设置产品零件
@Override
public void setPart(){
//处理Product
}
//组建产品
@Override
public Product buildProduct(){
return pro;
}
}
/**
* ❉ ❉ ❉ ❉ ❉ 导演 ❉ ❉ ❉ ❉ ❉
*
* 起到封装作用,避免高层模块深入到建造者内部的实现类。
* 建造者模式比较庞大时,导演类可以有多个
*/
class Dirctor{
private ConcreateBuilder builder = new ConcreateBuilder();
public Product getAProduct(){
builder.setPart();//设置零件
return builder.buildProduct();//生成产品
}
}