简介
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。建造者模式又被称为生成器模式,建造模式等,实际上建造者模式的核心就在于把对象的构造过程抽象出来。
让我们举个例子,比如我们常常在电视上看到做菜的节目,做一道菜出来,必须是要经过洗菜,炒菜,放盐,放调料……吧啦吧啦一套程序下来,才能变成我们吃的美味的菜,但是轮到我们自己做的时候,可能就已经不是很记得清步骤了,到底是要先放盐呢还是要先加水呢?这个时候我们就会想到把这个做菜的步骤记录下来,然后自己就可以一步一步按照步骤来做菜了,也许在细致一点,我们还可以把放多少盐加多少水都记下来,这样我们自己做的菜就和电视里面的菜相差无几了。
该模式的主要优点如下:
- 各个具体的建造者相互独立,有利于系统的扩展。
- 客户端不必知道产品内部组成的细节,便于控制细节风险。
其缺点如下︰
- 产品的组成部分必须相同,这限制了其使用范围。
- 如果产品的内部变化复杂,该模式会增加很多的建造者类。
建造者(Builder )模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
应用实例:写作文
首先定义写作文的步骤有哪些,写标题,写开头,写内容,写结尾,那么先定义一个接口,列举所有的步骤,
取名为CompositionBuilder。
package com.mori.design.pattern.builder;/*** 作文** @author mori*/public interface CompositionBuilder {/*** 写标题** @return {@link String}*/String writeTitle();/*** 写开头** @return {@link String}*/String writeTheBeginning();/*** 写内容** @return {@link String}*/String writeContent();/*** 写结尾** @return {@link String}*/String writeTheEnd();}
作文有不同的主题,对于不同的主题,实现是不同的。比如一个是春游,一个是看电影。
package com.mori.design.pattern.builder;/*** 春游作文* @author mori*/public class SpringOutingCompositionBuilder implements CompositionBuilder {@Overridepublic String writeTitle() {return "春游";}@Overridepublic String writeTheBeginning() {return "今天,我们几个人去春游。";}@Overridepublic String writeContent() {return "我们去了哪里,看到什么风景,怎么怎么样。";}@Overridepublic String writeTheEnd() {return "啊!春游真好!真有意义啊!";}}
package com.mori.design.pattern.builder;/*** 看电影作文* @author mori*/public class WatchingMovieCompositionBuilder implements CompositionBuilder{@Overridepublic String writeTitle() {return "看电影";}@Overridepublic String writeTheBeginning() {return "今天,我们几个人一起去看电影。";}@Overridepublic String writeContent() {return "去哪个电影院,看什么电影,有什么感触。。。";}@Overridepublic String writeTheEnd() {return "啊!电影真好看,下次还想看!";}}
接下来是建造者模式的核心点,无论什么类型的作文,我们写作文的步骤是一样的,我们用一个执行者定义对象的构建步骤,然后传入不同的builder,即可根据相同的步骤构建出我们需要的对象。
package com.mori.design.pattern.builder;/*** 学生类,具体创建对象的执行者** @author mori*/public class Student {/*** 写作文,传入不同的builder,总是根据相同的过程构造对象** @return {@link String}*/public String writeComposition(CompositionBuilder builder) {String title = builder.writeTitle();String theBeginning = builder.writeTheBeginning();String content = builder.writeContent();String theEnd = builder.writeTheEnd();return title + "\n" + theBeginning + "\n" + content + "\n" + theEnd;}}
测试
package com.mori.design.pattern.test.builder;import com.mori.design.pattern.builder.SpringOutingCompositionBuilder;import com.mori.design.pattern.builder.Student;import com.mori.design.pattern.builder.WatchingMovieCompositionBuilder;import org.junit.jupiter.api.DisplayName;import org.junit.jupiter.api.Test;/*** 建造者模式测试** @author mori* @date 2021/07/19*/@DisplayName("建造者测试用例")public class BuilderTest {@Testpublic void test(){Student s1 = new Student();System.out.println(s1.writeComposition(new SpringOutingCompositionBuilder()));System.out.println("------------下一篇作文--------------");System.out.println(s1.writeComposition(new WatchingMovieCompositionBuilder()));}}
控制台输出结果:
春游今天,我们几个人去春游。我们去了哪里,看到什么风景,怎么怎么样。啊!春游真好!真有意义啊!------------下一篇作文--------------看电影今天,我们几个人一起去看电影。去哪个电影院,看什么电影,有什么感触。。。啊!电影真好看,下次还想看!
