文章内容输出来源:拉勾教育Java高薪训练营
写在前面:
本人从一线城市回到二三线,怕自己技术落后,所以选择报名了这一期拉勾的java训练营,主要目的是为了再重新顺一遍框架底层,加深一下印象。很多技术在应用中,都忘记了原理,所以回来重新捡起来。自己找学习资源不方便的一点是版本,有很多技术,虽然与高版本通用,但会遗漏很多新特性。而且很多问题点没办法去问。平时工作忙起来的话,也不能随着自己的学习进度去调整,很快就遗忘了。所以尝试一下这种形式。
课程本身来说,讲义非常细致,也很全面。首先提出问题,然后提出针对这种问题,设计者们采用了什么思想和什么方式,一步步的去剖析框架,从最基础的需要入手,最终把框架完整的展现在面前。而不是像很多教程,直接上来就教底层,上来就教使用。全程没有废话,语言非常简洁,直接说明重点,没有任何拖泥带水。课程采用阶段闯关式,这种形式非常适合上班族,把一个质变的过程阶段化,让学习的人能通过完成阶段小目标得到阶段性的提升,最终实现整体上思维的升级。
学习群的氛围还是非常好的,大家都非常热心的互相解决工作和学习中的问题。良好的氛围有助于坚持学习的过程。 技术导师和班主任也非常负责,会反复确认学员的学习状态,快速的解答阶段中的疑惑。所以个人认为这个课程是物有所值。
在学习中还需要整理笔记,这一点由于我整理的比较杂乱,很多笔记都只有自己能看懂,所以像此篇,经过认真整理之后,才会发出来:
接下来将会对每一种设计模式进行举例,同时找到Mybatis中的体现
1.Builder模式
builder模式的定义为:将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。
它属于创建类模式,一般来说,如果一个对象的构建比较复杂,超出构造函数能包含的范围,就可以使用工厂模式和builder模式。工厂模式会产出完整产品,而builder应用于更加复杂的对象的构建,甚至只是一小部分,也就是用多个简单的对象一步步构建为复杂对象。
1.1 举栗子:用builder设计模式生产computer
步骤:
- 将需要构建的目标类分成多个部件(电脑可以分为主机、显示器、键盘、音箱等部件)
- 创建构建类
- 依次构建部件
- 将部件组装成目标对象
首先在项目中引入lombok辅助构建对象(可选)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
1.1.1 定义computer
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Computer {
// 显示器
private String displayer;
// 主机
private String mainUnit;
// 鼠标
private String mouse;
// 键盘
private String keyboard;
}
1.1.2 ComputerBuilder
public class ComputerBuilder {
private Computer computer = new Computer();
public void installDisplayer(String displayer) {
computer.setDisplayer(displayer);
}
public void installMainUnit(String mainUnit) {
computer.setMainUnit(mainUnit);
}
public void installMouse(String mouse) {
computer.setMouse(mouse);
}
public void installKeyboard(String keyboard) {
computer.setKeyboard(keyboard);
}
public Computer getComputer() {
return computer;
}
}
1.1.3 调用测试:
public static void main(String[]args){
ComputerBuilder computerBuilder=new ComputerBuilder();
computerBuilder.installDisplayer("显示器");
computerBuilder.installMainUnit("主机");
computerBuilder.installKeybord("键盘");
computerBuilder.installMouse("鼠标");
Computer computer=computerBuilder.Builder();
System.out.println(computer);
}
1.2 Mybatis中的体现
Mybatis的初始化工作很复杂,构造函数搞不定,所以使用了builder模式,构建了大量builder,进行分层构造,核心对象Configuration使用XMLConfigBuilder来进行构造。
在Mybatis环境的初始化过程中,SqlSessionFactoryBuilder会调用XMLConfigBuilder读取所有的MybatisMapConfig.xml 和所有的 *Mapper.xml 文件,构建 Mybatis 运行的核心对象 Configuration对 象,然后将该Configuration对象作为参数构建一个SqlSessionFactory对象。
private void parseConfiguration(XNode root) {
try {
//解析<properties />标签
propertiesElement(root.evalNode("properties"));
// 解析 <settings /> 标签
Properties settings = settingsAsProperties(root.evalNode("settings"));
//加载自定义的VFS实现类
loadCustomVfs(settings);
// 解析 <typeAliases /> 标签
typeAliasesElement(root.evalNode("typeAliases"));
//解析<plugins />标签
pluginElement(root.evalNode("plugins"));
// 解析 <objectFactory /> 标签
objectFactoryElement(root.evaINode("obj ectFactory"));
// 解析 <objectWrapper Factory /> 标签
obj ectWrappe rFacto ryElement(root.evalNode("objectWrapperFactory"));
// 解析 <reflectorFactory /> 标签
reflectorFactoryElement(root.evalNode("reflectorFactory"));
// 赋值 <settings /> 到 Configuration 属性
settingsElement(settings);
// read it after objectFactory and objectWrapperFactory issue #631
// 解析 <environments /> 标签
environmentsElement(root.evalNode("environments"));
// 解析 <databaseIdProvider /> 标签
databaseldProviderElement(root.evalNode("databaseldProvider"));
typeHandlerElement(root.evalNode("typeHandlers"));
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
XMLConfigBuilder 在构建 Configuration 对象时,也会调用 XMLMapperBuilder 用于读取 *Mapper 文件,而XMLMapperBuilder会使用XMLStatementBuilder来读取和build所有的SQL语句。
//解析<mappers />标签
mapperElement(root.evalNode("mappers"));
在这个过程中,有一个相似的特点,就是这些Builder会读取文件或者配置,然后做大量的XpathParser 解析、配置或语法的解析、反射生成对象、存入结果缓存等步骤,这么多的工作都不是一个构造函数所 能包括的,因此大量采用了 Builder模式来解决 。
2.工厂模式
Mybatis中比如SqlSessionFactory使用的是工厂模式,该工厂没有那么复杂的逻辑,是一个简单工厂 模式。简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于创 建型模式。 在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类 。
2.1 举栗子:生产Computer
假设有一个电脑的代工生产商,它目前已经可以代工生产联想电脑了,随着业务的拓展,这个代工生产 商还要生产惠普的电脑,我们就需要用一个单独的类来专门生产电脑,这就用到了简单工厂模式。
步骤
2.1.1 创建抽象产品类
我们创建一个电脑的抽象产品类,他有一个抽象方法用于启动电脑:
public abstract class Computer {
public abstract void start();
}
2.1.2 创建具体产品类
接着我们创建各个品牌的电脑,他们都继承了他们的父类Computer,并实现了父类的start方法:
public class LenovoComputer extends Computer{
@Override
public void start() {
System.out.println("联想电脑启动");
}
public class HpComputer extends Computer{
@Override
public void start() {
System.out.println("惠普电脑启动");
}
}
2.1.3 创建工厂类
接下来创建一个工厂类,它提供了一个静态方法createComputer用来生产电脑。你只需要传入你 想生 产的电脑的品牌,它就会实例化相应品牌的电脑对象。
public class ComputerFactory {
public static Computer createComputer(String type) {
Computer computer = null;
switch (type) {
case "lenovo":
computer = new LenovoComputer();
case "