由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架构引发的工厂模式介绍的主要内容,如果未能解决你的问题,请参考以下文章

由mybatis架构引发的工厂模式介绍

由解耦引发出的 Java设计模式之工厂模式

Mybatis源码分析三-数据源模块分析,工厂模式的使用

阿里P8架构师学习路线:设计模式原则+Spring+SpringMVC+Mybatis

mybatis架构理解

Mybatis