由mybatis架构引发的工厂模式介绍
Posted 老赖的小弟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由mybatis架构引发的工厂模式介绍相关的知识,希望对你有一定的参考价值。
前言
接触mybatis框架已近过了好长时间了,但是对于mybatis的架构图(如下Mybatis的架构图)还是不太懂,这个框架的为什么要多做了好多无用功,建各种容器那不太懂,后来发现原来是mybatis引入了,一个设计模式——>工厂模式,这样目标一下就清晰了,干工厂模式
一、工厂模式介绍
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。主要解决接口接口选择问题,定义一个创建对象的接口,让其子类决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
二、使用工厂模式的优缺点
1.优点
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口
2.缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
三、关于工厂模式理解(实景+代码演示)
实现
我们将创建一个 SmartPhone 接口和实现 SmartPhone接口的实体类。下一步是定义工厂类 Mom。Player 类使用 Mom 来获取 game 对象。它将向 Mom传递信息,以便获取它所需对象的类型,如下图所示
实景
我们的实景是,小明想要玩最喜欢的三个游戏分别是王者,吃鸡,原神,但是玩游戏得大前提是有个智能手机,但是的但是,有了手机这个手机却被他的妈妈管着,不能随心所欲的玩手机,得同意才能玩。
弄手机
代码如下(创建一个手机(创建一个关于游戏的接口)):
package com.cc;
/**
*
* @author 老赖的小弟
*造出一个手机
*/
public interface SmartPhone {
// 只有一个方法play
void play();
}
安装游戏
代码如下(安装王者):
package com.cc;
/**
*
* @author 老赖的小弟
*1、实现SmartPhone接口
*2、重写play方法
*/
public class HonorOfKings implements SmartPhone {
@Override
public void play() {
System.out.println("玩王者荣耀");
}
}
代码如下(安装吃鸡):
package com.cc;
/**
*
* @author 老赖的小弟
*1、实现SmartPhone接口
*2、重写play方法
*/
public class GameForPeace implements SmartPhone {
@Override
public void play() {
System.out.println("玩和平精英");
}
}
代码如下(安装原神):
package com.cc;
/**
*
* @author 老赖的小弟
*1、实现SmartPhone接口
*2、重写play方法
*/
public class OriginalGod implements SmartPhone {
@Override
public void play() {
System.out.println("玩元神");
}
}
得不了玩游戏
代码如下(由于表现不好这次请求玩游戏遭到拒绝):
package com.cc;
/**
*
* @author 老赖的小弟
*1、实现SmartPhone接口
*2、重写play方法
*/
public class GameOver implements SmartPhone {
@Override
public void play() {
System.out.println("作业做完了?!!!^_^");
}
}
手机目前是在妈妈手里(对象实现工厂)
代码如下(对象实现工厂):
package com.cc;
/**
*
* @author 老赖的小弟
*1、构建成员变量
*2、使用switch...case进行选择判断
*/
public class Mom {
public static final int HK = 1;
public static final int GP = 2;
public static final int OG = 3;
public static SmartPhone getGame(int game) {
switch(game) {
case HK:
return new HonorOfKings();
case GP:
return new GameForPeace();
case OG:
return new OriginalGod();
default:
return new GameOver();
}
}
}
小明请求玩游戏
代码如下(小明的两次请求):
package com.cc;
public class Player {
public static void main(String[] args) {
// 调用getGame方法输入参数,调用工厂类方法
SmartPhone player1 = Mom.getGame(Mom.HK);
player1.play();
SmartPhone player2 = Mom.getGame(6);
player2.play();
}
}
代码如下(得到的回应):
玩王者荣耀
作业做完了?!!!^_^
总结
小明真是个贪玩的的孩子,玩一次不够还想再玩,哈哈,不过这里面看着是工厂模式,但是再往深一点看,这不就是接口和抽象类的结合使用嘛,
接口不就是“规矩”,作用:就是解耦合,提高程序的可扩展性,
抽象类作用:就是降低接口实现类对接口实现过程的难度,具体就是将接口中不需要使用抽象方法交给抽象类进行完成,这样接口实现类只需要对接口实现类所需要方法进行重写
关于接口和抽象类的区别可以看看下面这篇文章:
Java中抽象类与接口的区别
以上是关于由mybatis架构引发的工厂模式介绍的主要内容,如果未能解决你的问题,请参考以下文章