设计模式只是面试八股文?
看过的文章只告诉了你源码怎么写,没告诉你应用场景?
本文将通过实际业务告诉你,工厂模式的应用场景以及思路,跟我一起学起来!
某公园入园系统验票时,可以刷身份证或二维码进行验票
需要开发该验票接口,支持身份证和二维码验票的同时,确保后期如果支持其他验票方式,尽可能小的改动源码
以上就是源哥在实际开发中遇到的需求,当我听完客户描述,脑海中就是四个大字——工厂模式!
话不多说我们直接看代码
/**
* TODO 接口传递模型
*
* @author 刘循源
* @since 2023/7/26
*/
@Data
public class TicketCheckVO {
private String certType; //qrCode 二维码验票 idCard 身份证验票
private String certInfo; //验票信息
}
/**
* TODO 工厂
*
* @author 刘循源
* @since 2023/7/13
*/
public class TicketCheckingFactory {
//使用静态内部类初始化工厂类
private static TicketCheckingFactory ticketCheckingFactory = new TicketCheckingFactory();
private static Map checkingMap = new HashMap<>();
//使用静态代码块,在项目初始化时,实例化对应的实现类,并放入map集合
static {
checkingMap.put("idCard", SpringContextUtils.getBean(IdCardCheckingServiceImpl.class));
checkingMap.put("qrCode", SpringContextUtils.getBean(QrCodeCheckingServiceImpl.class));
}
//私有无参构造,确保工厂对象不能被new
private TicketCheckingFactory() {
}
public static TicketCheckingFactory getInstance() {
return ticketCheckingFactory;
}
//通过该方法在map集合中获取对应的实现类
public TicketCheckingService create(String checkType){
return (TicketCheckingService) checkingMap.get(checkType);
}
}
/**
* TODO 验票接口
*
* @author 刘循源
* @since 2023/7/13
*/
public interface TicketCheckingService {
/**
* TODO 验票
* @author 刘循源
* @since 2023/7/13 16:27
* @param certInfo 验票信息
* @return boolean
*/
boolean checking(String certInfo);
}
/**
* TODO 封装公共逻辑,避免代码冗余
* @author 刘循源
* @since 2023/7/13
*/
public abstract class TicketCheckingAbstract implements TicketCheckingService {
//在我的业务逻辑中,需要对验票信息进行保存,对于相同的逻辑,可以将代码封装到抽象类
protected void saveLog(){
System.out.println("验票日志保存了");
}
}
/**
* TODO 根据身份证信息进行验票
*
* @author 刘循源
* @since 2023/7/13
*/
@Service
public class IdCardCheckingServiceImpl extends TicketCheckingAbstract {
@Override
public boolean checking(String certInfo) {
System.out.println("使用身份证核验了票据信息");
super.saveLog();
return true;
}
}
/**
* TODO 根据二维码信息进行验票
*
* @author 刘循源
* @since 2023/7/13
*/
@Service
public class QrCodeCheckingServiceImpl extends TicketCheckingAbstract {
@Override
public boolean checking(String certInfo) {
System.out.println("使用二维码核验了票据信息");
super.saveLog();
return true;
}
}
@RestController
@RequestMapping("/ticketCheck")
@Api(tags = "验票")
public class TicketCheckController {
/**
* TODO 验票
*
* @author 刘循源
* @since 2023/7/11 14:33
*/
@PostMapping("ticketChecking")
public boolean ticketChecking(@RequestBody TicketCheckVO ticketCheckVO) {
TicketCheckingService ticketCheckingService = TicketCheckingFactory.getInstance().create(ticketCheckVO.getCertType());
return ticketCheckingService.checking(ticketCheckVO.getCertInfo());
}
}
以上就是全部的实现代码,通过工厂模式,我们保证了不同验票方式的解耦,并且如果以后出现了其他的验票方式,我们只需要创建新的实现类实现验票接口,并将该实现类在Factory中实例化即可,对于已有代码的修改极小,完美实现了客户的需求
我是源哥,您的点赞和关注就是对我创作的最大鼓励