构建者模式,旨在将一个复杂的对象的构建过程与其表示分离,是的同样的构建过程可以创建出不同的表示。也就是说,隐藏创建对象的过程以及细节,在用户不知对象创建过程和细节的情况下,直接创建复杂的对象。

其组成模型如下:

组成 作用
Builder(抽象构造器) 提供创建产品的所需流程,对应为接口方法
ConcreteBuilder(具体构造器) 实现各个部件的创建并组装,并提供一个生产最终产品的方法
Director(指导者) 使用Builder接口,呈现出一个统一创建产品的过程
Product(产品) 表示需要生产的复杂的对象,包含了多个部件

构建者模式的优点

  1. 易于解耦;将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象
  2. 易于精确控制对象的创建;将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰
  3. 易于拓展;增加新的具体建造者无需修改原有类库的代码,易于拓展,符合开闭原则

构建者模式的缺点

  1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制
  2. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大

构建者模式最佳实践

  1. 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性
  2. 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品

构建者模式实现步骤

  1. 创建Director,负责将具体的产品划分为不同的部件;
  2. 创建Builder,定义产品的每个部件;
  3. 创建ConcreteBuilder,赋予每个部件的具体实现;
  4. 创建出最终的产品Product;

构建者模式实现示例

实现一个系统,产品经理会下发需求,陈述该系统由哪几个模块组成,并将需求转交给团队Leader。Leader拿到需求之后,将之下发给开发实现,最终实现一个完整的系统。

在这里:

  • Director就是产品经理;
  • Builder就是团队Leader;
  • ConcreteBuilder就是开发;
  • Product就是该系统
  1. public class Builder {
  2. public interface IBuilder {
  3. // 登录模块
  4. void login();
  5. // 商城模块
  6. void mall();
  7. // 支付模块
  8. void pay();
  9. // 订单模块
  10. void order();
  11. // 组建系统
  12. MallSystem build();
  13. }
  14. public static class SystemBuilder implements IBuilder {
  15. private MallSystem system = new MallSystem();
  16. @Override
  17. public void login() {
  18. system.create("编写登录模块");
  19. }
  20. @Override
  21. public void mall() {
  22. system.create("编写商城模块");
  23. }
  24. @Override
  25. public void pay() {
  26. system.create("编写支付模块");
  27. }
  28. @Override
  29. public void order() {
  30. system.create("编写订单模块");
  31. }
  32. @Override
  33. public MallSystem build() {
  34. return system;
  35. }
  36. }
  37. public static class ProductManager {
  38. public void createSystem(IBuilder builder) {
  39. builder.login();
  40. builder.mall();
  41. builder.order();
  42. builder.pay();
  43. }
  44. }
  45. public static class MallSystem {
  46. private StringBuilder sb = new StringBuilder();
  47. public void create(String step) {
  48. sb.append(step);
  49. sb.append("\n");
  50. }
  51. public void showStep() {
  52. System.out.println(sb.toString());
  53. }
  54. }
  55. public static void main(String[] args) {
  56. // 创建产品经理,决定这个商城系统需要分为这些模块
  57. ProductManager productManager = new ProductManager();
  58. IBuilder builder = new SystemBuilder();
  59. productManager.createSystem(builder);
  60. // 展示系统的组成
  61. MallSystem build = builder.build();
  62. build.showStep();
  63. }
  64. }

打印结果如下:
** :::success 编写登录模块
编写商城模块
编写订单模块
编写支付模块 :::