生成器模式
- 生成器模式的定义:
- 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
- 要实现同样的构建过程可以创建不同的表现,那么一个自然的思路就是先把构建过程独立出来,在生成器模式中把它称为指导者,有它来指导装配过程,但是不负责每步具体的实现。当然,光是有指导者是不够的,必须要有能具体实现每步的对象,在生成器模式中称这些实现对象为生成器
-
- Builder:生成器接口,定义创建一个Product对象所需的各个部件的操作
- ConcreteBuilder:具体的生成器实现,实现各个部件的创建,并负责组装Product对象的各个部件,同时还提供一个让用户获取组装完成后的产品对象的方法
- Director:指导者,也被称为导向者,主要用来使用Builder接口,以一个统一的过程来构建所需要的Product对象
- Product:产品,表示被生成器构建的复杂对象,包含多个部件
public interface Builder {
public void buildPart();
}
public class ConcreteBuilder implements Builder {
private Product resultProduct;
public Product getResult() {
return resultProduct;
}
public void builderPart() {
}
}
public interface Product {
}
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct() {
builder.builderPart();
}
}
- 生成器模式的功能
- 构建复杂的产品,而且是细化的、分步骤的构建产品,也就是生成器模式重在一步一步解决构建复杂对象的问题
- 更为重要的是,这个构建的过程是统一的、固定不变的,变化的部分放到生成器部分了,只要配置不同的生成器,那么同样的构建过程就能构造出不同的产品来
- 生成器模式的构建
- 一个部分是Builder接口,这里是定义了如何构建各个部件,也就是知道每个部件功能如何实现,以及如何装配这些部件到产品中去
- 另外一个部分是Director,Director是知道如何组合来构建产品,也就是说Director负责整体的构建算法,而且通常是分步骤地来执行
- 不管如何变化,Builder模式都存在这么两个部分,一个部分是部件构造和产品装配,另外一个部分是整体构建的算法
- 在Director实现整体构建算法时,遇到需要创建和组合具体部位的时候,就会把这些功能通过委托交给Builder去完成
- 生成器模式的使用
- 应用生成器模式的时候,可以让客户端创建Director,在Director里面封装整体构建算法,然后让Director去调用Builder,让Builder来封装具体部件的构建功能
- 还有一种退化的情况,就是让客户端和Director融合起来,让客户端直接去操作Builder,就好像是指导者自己想要给自己构建产品一样
- 生成器模式的优点
- 松散耦合
- 可以很容易的改变产品的内部表示
- 更好的复用性
- 生成器模式的本质
- 生成器模式的重心还是在于分离整体构建算法和部件构造,而分离步骤构建对象不过是整体构建算法的一个简单表现,或者说是一个附带产物
- 何时选用生成器模式
- 如果创建对象的算法,应该独立于该对象的组成部分以及它们的装配方式时
- 如果同一个构建过程有着不同的表示时