简介

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。建造者模式又被称为生成器模式,建造模式等,实际上建造者模式的核心就在于把对象的构造过程抽象出来。
让我们举个例子,比如我们常常在电视上看到做菜的节目,做一道菜出来,必须是要经过洗菜,炒菜,放盐,放调料……吧啦吧啦一套程序下来,才能变成我们吃的美味的菜,但是轮到我们自己做的时候,可能就已经不是很记得清步骤了,到底是要先放盐呢还是要先加水呢?这个时候我们就会想到把这个做菜的步骤记录下来,然后自己就可以一步一步按照步骤来做菜了,也许在细致一点,我们还可以把放多少盐加多少水都记下来,这样我们自己做的菜就和电视里面的菜相差无几了。

该模式的主要优点如下:

  • 各个具体的建造者相互独立,有利于系统的扩展。
  • 客户端不必知道产品内部组成的细节,便于控制细节风险。

其缺点如下︰

  • 产品的组成部分必须相同,这限制了其使用范围。
  • 如果产品的内部变化复杂,该模式会增加很多的建造者类。

建造者(Builder )模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。

应用实例:写作文

首先定义写作文的步骤有哪些,写标题,写开头,写内容,写结尾,那么先定义一个接口,列举所有的步骤,
取名为CompositionBuilder。

  1. package com.mori.design.pattern.builder;
  2. /**
  3. * 作文
  4. *
  5. * @author mori
  6. */
  7. public interface CompositionBuilder {
  8. /**
  9. * 写标题
  10. *
  11. * @return {@link String}
  12. */
  13. String writeTitle();
  14. /**
  15. * 写开头
  16. *
  17. * @return {@link String}
  18. */
  19. String writeTheBeginning();
  20. /**
  21. * 写内容
  22. *
  23. * @return {@link String}
  24. */
  25. String writeContent();
  26. /**
  27. * 写结尾
  28. *
  29. * @return {@link String}
  30. */
  31. String writeTheEnd();
  32. }

作文有不同的主题,对于不同的主题,实现是不同的。比如一个是春游,一个是看电影。

  1. package com.mori.design.pattern.builder;
  2. /**
  3. * 春游作文
  4. * @author mori
  5. */
  6. public class SpringOutingCompositionBuilder implements CompositionBuilder {
  7. @Override
  8. public String writeTitle() {
  9. return "春游";
  10. }
  11. @Override
  12. public String writeTheBeginning() {
  13. return "今天,我们几个人去春游。";
  14. }
  15. @Override
  16. public String writeContent() {
  17. return "我们去了哪里,看到什么风景,怎么怎么样。";
  18. }
  19. @Override
  20. public String writeTheEnd() {
  21. return "啊!春游真好!真有意义啊!";
  22. }
  23. }
  1. package com.mori.design.pattern.builder;
  2. /**
  3. * 看电影作文
  4. * @author mori
  5. */
  6. public class WatchingMovieCompositionBuilder implements CompositionBuilder{
  7. @Override
  8. public String writeTitle() {
  9. return "看电影";
  10. }
  11. @Override
  12. public String writeTheBeginning() {
  13. return "今天,我们几个人一起去看电影。";
  14. }
  15. @Override
  16. public String writeContent() {
  17. return "去哪个电影院,看什么电影,有什么感触。。。";
  18. }
  19. @Override
  20. public String writeTheEnd() {
  21. return "啊!电影真好看,下次还想看!";
  22. }
  23. }

接下来是建造者模式的核心点,无论什么类型的作文,我们写作文的步骤是一样的,我们用一个执行者定义对象的构建步骤,然后传入不同的builder,即可根据相同的步骤构建出我们需要的对象。

  1. package com.mori.design.pattern.builder;
  2. /**
  3. * 学生类,具体创建对象的执行者
  4. *
  5. * @author mori
  6. */
  7. public class Student {
  8. /**
  9. * 写作文,传入不同的builder,总是根据相同的过程构造对象
  10. *
  11. * @return {@link String}
  12. */
  13. public String writeComposition(CompositionBuilder builder) {
  14. String title = builder.writeTitle();
  15. String theBeginning = builder.writeTheBeginning();
  16. String content = builder.writeContent();
  17. String theEnd = builder.writeTheEnd();
  18. return title + "\n" + theBeginning + "\n" + content + "\n" + theEnd;
  19. }
  20. }

测试

  1. package com.mori.design.pattern.test.builder;
  2. import com.mori.design.pattern.builder.SpringOutingCompositionBuilder;
  3. import com.mori.design.pattern.builder.Student;
  4. import com.mori.design.pattern.builder.WatchingMovieCompositionBuilder;
  5. import org.junit.jupiter.api.DisplayName;
  6. import org.junit.jupiter.api.Test;
  7. /**
  8. * 建造者模式测试
  9. *
  10. * @author mori
  11. * @date 2021/07/19
  12. */
  13. @DisplayName("建造者测试用例")
  14. public class BuilderTest {
  15. @Test
  16. public void test(){
  17. Student s1 = new Student();
  18. System.out.println(s1.writeComposition(new SpringOutingCompositionBuilder()));
  19. System.out.println("------------下一篇作文--------------");
  20. System.out.println(s1.writeComposition(new WatchingMovieCompositionBuilder()));
  21. }
  22. }

控制台输出结果:

  1. 春游
  2. 今天,我们几个人去春游。
  3. 我们去了哪里,看到什么风景,怎么怎么样。
  4. 啊!春游真好!真有意义啊!
  5. ------------下一篇作文--------------
  6. 看电影
  7. 今天,我们几个人一起去看电影。
  8. 去哪个电影院,看什么电影,有什么感触。。。
  9. 啊!电影真好看,下次还想看!