什么是建造者模式?他在jdk、MyBatis源码怎么运用?( 二 )

这就是一个简单的构造者模式写法 , 上面的1,2,3,4行代码可以只选择任意1个或者任意搭配的个数 , 从而创造出独立不同的产品 。
这种写法虽然简单 , 但是因为不是面向抽象编程 , 导致扩展性不好 , 所以我们再继续看一下建造者模式标准的写法
标准写法示例1、产品(Product)产品类复用上面简单示例的产品类
2、抽象建造者(Builder)创建一个抽象建造者:
package com.zwx.design.pattern.builder.standard;import com.zwx.design.pattern.builder.Homework;/** * 建造者模式-抽象建造者(Builder) */public abstract class HomeworkBuilder {public abstract HomeworkBuilder buildEasyQc(String easyQc);public abstract HomeworkBuilder buildNormalQc(String normalQc);public abstract HomeworkBuilder buildMediumQc(String mediumQc);public abstract HomeworkBuilder buildHardQc(String hardQc);public abstract Homework build();}这个类定义了5个方法 , 前面4个是产品类 , 实际开发中可以任意定义 , 相当于一个方法就是一个产品中的某一个部分 , 然后最后一个方法就是返回一个构建好的产品 。
3、建造者(ConcreteBuilder)创建一个实际的建造者角色类:
package com.zwx.design.pattern.builder.standard;import com.zwx.design.pattern.builder.Homework;/** * 建造者模式-具体建造者(ConcreteBuilder) */public class ConcreateBuilder extends HomeworkBuilder {private Homework homework;public ConcreateBuilder(Homework homework) {this.homework = homework;}@Overridepublic HomeworkBuilder buildEasyQc(String easyQc) {homework.setEasyQc(easyQc);return this;}@Overridepublic HomeworkBuilder buildNormalQc(String normalQc) {homework.setEasyQc(normalQc);return this;}@Overridepublic HomeworkBuilder buildMediumQc(String mediumQc) {homework.setEasyQc(mediumQc);return this;}@Overridepublic HomeworkBuilder buildHardQc(String hardQc) {homework.setEasyQc(hardQc);return this;}@Overridepublic Homework build() {return homework;}}这个类里面初始产品我们是通过构造器传进去 , 实际上也可以不传 , 通过其他方法初始化也是可以的 , 这个看需求或者个人喜好 。
注意:每个创建部分产品最后的返回值返回的都是this , 这样就可以实现链式写法 , 具体看下面的调用者写法
4、调用者(Director)最后调用者来创建产品
package com.zwx.design.pattern.builder.standard;import com.alibaba.fastjson.JSONObject;import com.zwx.design.pattern.builder.Homework;/** * 建造者模式-调用者(Director) */public class HomeworkDirector {public static void main(String[] args) {Homework homework = new Homework();HomeworkBuilder homeworkBuilder = new ConcreateBuilder(homework);homeworkBuilder.buildEasyQc("我是一道简单题目").buildNormalQc("我是一道标准难度题目").buildMediumQc("我是一道中等难度题目").buildMediumQc("我是一道高难度题目");homework = homeworkBuilder.build();System.out.println(JSONObject.toJSONString(homework));}}可以看到 , 这里不用和之前一样一行行去调用 , 直接通过链式写法一直往下build , 最终调用build()方法返回完整的产品对象 。
PS:很多地方的写法是把调用者根据不同组合封装起一个个方法供外界调用 , 这也是一种最严格标准的写法 , 只适合于排列组合较少结果的产品 。 如果有很多种搭配 , 还是目前这种写法比较合适 , 直接由使用者自己来选择搭配 。
适用场景建造者模式适用于一个具有较多的零件的复杂产品创建过程 , 而且产品的各个组成零件还会经常发生变化或者说需要支持动态变化 , 但是零件的种类却总体稳定的场景: