定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
![](https://i-blog.csdnimg.cn/blog_migrate/64ef96a493d89e05bfb790e7f744c15a.png)
Builder: 建造者接口,定义创建一个Product对象所需的各个部件的操作
ConcreteBuilder: 具体的建造者实现,实现各个部件的创建,并负责组装Product对象的各个部件,同时还提供一个让用户获取组装完成后的产品对象的方法
Director: 指导者,也被成为导向者,主要用来使用Builder接口,以一个统一的过程来构建所需要的Product对象
Product: 产品,表示被建造者构建的复杂对象,包含多个部件
/**
* 建造者接口,定义创建一个产品对象所需的各个部件的操作
*/
public interface Builder {
/**
* 示意方法,构建某个部件
*/
public void buildPart();
}
/**
* 被构建的产品对象的接口
*/
public interface Product {
//定义产品的操作
}
/**
* 具体的建造者实现对象
*/
public class ConcreteBuilder implements Builder {
/**
* 建造者最终构建
*/
private Product resultProduct;
public Product getResultProduct() {
return resultProduct;
}
@Override
public void buildPart() {
//构建某个部件的功能处理
}
}
/**
* 指导者,指导使用建造者的接口来构建产品的对象
*/
public class Director {
/**
* 持有当前需要使用的建造者对象
*/
private Builder builder;
/**
* 构造方法,传入建造者对象
* @param builder 建造者对象
*/
public Director(Builder builder) {
this.builder = builder;
}
/**
* 示意方法,知道建造者构建最终的产品对象
*/
public void construct() {
//通过建造者接口来构建最终的产品对象
builder.buildPart();
}
}
建造者模式的主要功能是构建复杂的产品,而且是细化的、分步骤的构建产品,也就是建造者模式重在一步一步解决构造复杂对象的问题。这个构建的过程是统一的、固定不变的,变化的部分放到建造者部分,只要配置不同的建造者,那么同样的构建过程,就能构建出不同的产品来。
需要注意的是,建造者模式分为两个重要的部分
1. 一部分是Builder接口,这里定义了如何构建各个部件,也就是知道每个部件功能如何实现,以及如何装配这些部件到产品去
2. 另外一个部分是Director,Director是知道如何组合来构建产品,也就是说Director负责整体的构建算法,而且通常是分步骤地来执行
在实际开发时,如果建造者对象和被构建的对象是分开的话,可能导致同包内的对象不使用建造者来构建对象,而是直接去使用new来构建对象,这会导致错误,另外,建造者的功能就是为了创建被构建的对象,完全可以不用单独一个类。对于这种情况,重构的手法通常是类内莲花放到类里面,也就是说吧构建器对象合并到被构建对象里面去。
生成器模式的优点:
松散耦合
可以很容易改变产品的内部表示
更好的复用性
生成器模式的本质是分离整体构建算法和部件构造
这里推荐两篇关于建造者模式非常深入描述的文章,不但将建造者模式叙述的深入浅出,对于建造者模式的应用场景分析非常细致和深入,值得学习