定义

建造者模式(Builder Pattern)也叫做生成器模式

Separate the construction of a complex object from its representation so that the same construction process can create different representations. (将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)

建造者模式的角色

  • Product产品类:通常是实现了模板方法模式,也就是有模板方法和基本方法。
  • Builder抽象建造者:规范产品的组建,一般是由子类实现。
  • ConcreteBuilder具体建造者:实现抽象类定义的所有方法,并且返回一个组建好的对象。
  • Director导演类:负责安排已有的顺序,然后告诉Builder开始建造。

建造者模式的通用代码

  1. /**
  2. * 产品类
  3. */
  4. public class Product {
  5. public void doSomething(){
  6. // 独立业务处理
  7. }
  8. }
  1. /**
  2. * 抽象建造者
  3. */
  4. public abstract class Builder {
  5. // 设置产品的不同部分,以获得不同的产品
  6. public abstract void setPart();
  7. // 建造产品
  8. public abstract Product buildProduct();
  9. }
  1. /**
  2. * 具体建造者
  3. */
  4. public class ConcreteProduct extends Builder {
  5. private Product product = new Product();
  6. // 设置产品零件
  7. @Override
  8. public void setPart() {
  9. // 产品类内的逻辑处理
  10. }
  11. // 组件一个产品
  12. @Override
  13. public Product buildProduct() {
  14. return product;
  15. }
  16. }
  1. /**
  2. * 导演类
  3. */
  4. public class Director {
  5. private Builder builder = new ConcreteProduct();
  6. // 构建不同的产品
  7. public Product getAProduct(){
  8. builder.setPart();
  9. // 设置不同的零件,产生不同的产品
  10. return builder.buildProduct();
  11. }
  12. }

建造者模式的应用

建造者模式的优点

  • 封装性

使用建造者模式可以使客户端不必知道产品内部组成的细节

  • 建造者独立,容易扩展

  • 便于控制细节风险

由于具体的建造者独立,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响

建造者模式的使用场景

  • 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以该模式
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候可以使用建造者模式
  • 在对象创建过程中会使用到系统中的一些对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。(这种场景只是一种补救方法,应该在设计阶段就使得一个对象容易获得)

建造者模式的注意事项

建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,关注重点不同。