由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中抽象类与接口的区别

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值