最近学习 Mybatis 源码,看到里面用到了一些设计模式,所以抽取时间进行整理一下。
Mybatis 中使用了构建者模式创建 SqlSessionFactory,这里对构建者模式做一个示例,方便理解。
定义
将一个复杂对象的构造与它的表示分离,使同样的构造可以构造出不同的表示,这样的设计模式被称为构建者模式。
构建者模式要素
- 构建者
- 私有的构建对象
- 共有的为构建对象赋值的方法
- 共有的返回构建对象的方法
- 共有的静态创建构建者方法(非必需,调用也可以通过 new 来创建构建者)
- 构建的对象(被构建者)
示例
/**
* 构建的对象
*/
@Data
public class Animal {
private String eye;
private String ears;
private String nose;
private String hair;
}
package com.winson;
/**
* 构建者
*/
public class AnimalBuilder {
//1、私有的构建的对象
private Animal animal = new Animal();
//4、共有的静态创建构建者方法(非必需,调用也可以通过 new 来创建构建者)
public static AnimalBuilder builder() {
return new AnimalBuilder();
}
//2、共有的为构建的对象赋值的方法
public AnimalBuilder eye(String eye) {
animal.setEye(eye);
return this;
}
//共有的为构建的对象赋值的方法
public AnimalBuilder ears(String ears) {
animal.setEars(ears);
return this;
}
//共有的为构建的对象赋值的方法
public AnimalBuilder nose(String nose) {
animal.setNose(nose);
return this;
}
//共有的为构建的对象赋值的方法
public AnimalBuilder hair(String hair) {
animal.setHair(hair);
return this;
}
//3、共有的返回构建的对象的方法
public Animal build() {
return animal;
}
}
public class TestBuilderModel {
/**
* 将一个复杂对象的构造与它的表示分离,使同样的构造可以构造出不同的表示,这样的设计模式被称为构建者模式
*/
@Test
public void builderTest() {
Animal animal = AnimalBuilder.builder().eye("blue").hair("yellow").build();
LogFactory.get().info("=========== {} =========== ", JSON.toJSON(animal));
}
}
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.19</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
构建者与setter方法、构造方法的区别:
- 构造方法我们需要关注构造函数的传参顺序,而构建者模式不需要关心
- setter方法是先创建一个对象,然后再set值,在没有完全赋值完成之前,就可能会被其他地方使用
- 构建者模式,是必须等调用build方法后才会返回构建完成的对象
构建者模式与工厂模式的区别:
工厂模式是创建千篇一律的对象,而构建者模式是可以根据自身需求创建出自定义的对象。
参考:https://www.cnblogs.com/liconglong/p/14171549.html,感谢原作者。