【代码整洁之道】JAVA设计模式——简单工厂模式实战应用思路(含实现代码)!

发布时间:2024年01月11日

前言

设计模式只是面试八股文?
看过的文章只告诉了你源码怎么写,没告诉你应用场景?
本文将通过实际业务告诉你,工厂模式的应用场景以及思路,跟我一起学起来!

业务需求

某公园入园系统验票时,可以刷身份证或二维码进行验票
需要开发该验票接口,支持身份证和二维码验票的同时,确保后期如果支持其他验票方式,尽可能小的改动源码

以上就是源哥在实际开发中遇到的需求,当我听完客户描述,脑海中就是四个大字——工厂模式!

为什么选择简单工厂模式

  1. 将创建对象的事交给工厂,客户端不用自己创建对象,明确了各个类的职责
  2. 如果想增加新的对象,只需要增加一个具体的类和具体的工厂类即可,不需要修改工厂方法,满足开闭原则。
  3. 解耦,不用工厂的话,客户端和new对象的代码耦合在一起,工厂创建对象就可以将二者分开解耦。后期维护容易,增强系统的扩展性

实现代码(仅设计模式应用相关)

话不多说我们直接看代码

/**
 * 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中实例化即可,对于已有代码的修改极小,完美实现了客户的需求

我是源哥,您的点赞和关注就是对我创作的最大鼓励

文章来源:https://blog.csdn.net/WatcherNight/article/details/135512463
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。