设计模式系列一工厂模式

设计模式系列一工厂模式


前言

针对于需要制定全局代码增加额外操作的需要,又具备多个不同的场景;可以通过使用工厂模式进行我们的逻辑实现管控;

提示:以下是本篇文章正文内容,下面案例可供参考

一、定义工厂类以及其下属

1.1 工厂类

首先需要定义一个工厂类,用来管理我们工人领导-接口;

package com.jal.designmode.Factory;

import com.jal.designmode.Factory.handler.AbstractHandler;
import com.jal.designmode.Factory.handler.HandlerService;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 工厂类 管理操作调度
 * Created on 2024/12/21
 */
@Slf4j
@Component
public class ProducedHandlerFactory {

    private static final Map<String, HandlerService> handlerMap = new HashMap<>();

    @Resource
    private List<AbstractHandler> abstractHandlerAbstracts;

    @PostConstruct
    private void init() {
       abstractHandlerAbstracts.forEach(item -> {
           handlerMap.put(item.getHandlerName(), item);
       });
    }

    public String produceHandler(String handlerName, String action) {
        if (!handlerMap.containsKey(handlerName)) {
            return "没有找到工厂处理类";
        }
        HandlerService handlerService = handlerMap.get(handlerName);
        return handlerService.handle(action);
    }
}

所以从代码上我们可以看到,使用了 Map<String, HandlerService> 结构来存储我们所拥有的车间-完成不同的工作任务; 根据车间号-key值来将任务分配到具体的工人去处理。
此时我们的 map 中的数据应该是了这样的:

(handlerFirst, HandlerFirstImpl)
(handlerSecond, HandlerSecondImpl)

1.2 创建接口-工人领导

定义接口用来指定任务,分配给对应的头子来实现。领导负责把任务下达,制定大概战略方针。

package com.jal.designmode.Factory.handler;

/**
 * Created on 2024/12/21
 */
public interface HandlerService {

    /**
     * 具体实现前处理逻辑
     * @param action
     */
    String handle(String action);
}

1.3 创建抽象类-工人头子

工人头子知道要去干啥,所以制定了详细的实现

package com.jal.designmode.Factory.handler;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * Created on 2024/12/21
 */
@Slf4j
@Component
public abstract class AbstractHandler implements HandlerService {

    /**
     * 处理后分发给具体的handler实现类
     * @param action
     */
    @Override
    public String handle(String action) {
        log.info("handle 处理中…………请稍后");
        return this.handleAction(action);
    }

    /**
     * 获取是实现类key值,用来定位实现类使用
     * @return
     */
    abstract public String getHandlerName();

    //handle实现具体处理
    abstract public String handleAction(String action);
}

工人头子在领导安排的下发任务下做出了更详细的计划,给下面的人制定了工作计划也即是 handleAction() ,但具体的执行任务还是要给具体的工人来去完成。

1.4 两个实现类-两个工人

package com.jal.designmode.Factory.handler.impl;

import com.jal.designmode.Factory.handler.AbstractHandler;
import com.jal.designmode.Factory.handler.HandlerTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * Created on 2024/12/21
 */
@Slf4j
@Service
public class HandlerFirstImpl extends AbstractHandler {

    @Override
    public String getHandlerName() {
        return HandlerTypeEnum.HANDLER_ONE.getCode();
    }

    @Override
    public String handleAction(String action) {
        log.info("this is first HandlerFirstImpl thanks!");
        return HandlerTypeEnum.HANDLER_ONE.getValue();
    }
}
package com.jal.designmode.Factory.handler.impl;

import com.jal.designmode.Factory.handler.AbstractHandler;
import com.jal.designmode.Factory.handler.HandlerTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * Created on 2025/3/23
 */
@Service
@Slf4j
public class HandlerSecondImpl extends AbstractHandler {

    @Override
    public String getHandlerName() {
        return HandlerTypeEnum.HANDLER_TWO.getCode();
    }

    @Override
    public String handleAction(String action) {
        log.info("加载实现类2");
        return HandlerTypeEnum.HANDLER_TWO.getValue();
    }

}

附加一个枚举类,管控一下对应的 code

package com.jal.designmode.Factory.handler;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
 * Created on 2025/3/23
 */
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum HandlerTypeEnum {

    HANDLER_ONE("handlerFirst", "工厂实现类1"),
    HANDLER_TWO("handlerSecond", "工厂实现类2"),
    ;
    private String code;
    private String value;

}

二、测试使用

2.1 简单写一个 Controller

通过接口调用可以直接明显得到结果;一般实际使用的时候肯定不会直接这样用获取返回值,小伙伴们需要注意下写法,可以根据需求调整相应的代码逻辑。

package com.jal.designmode.Factory.controller;

import com.jal.designmode.Factory.ProducedHandlerFactory;
import com.jal.designmode.Factory.handler.HandlerTypeEnum;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created on 2024/12/21
 */
@RestController
@RequestMapping("/test")
public class FactoryTestController {
    private static final Logger log = LoggerFactory.getLogger(FactoryTestController.class);
    @Resource
    private ProducedHandlerFactory producedHandlerFactory;

    @GetMapping("/factory")
    public String test() {
        log.info("test1");
        return producedHandlerFactory.produceHandler(HandlerTypeEnum.HANDLER_ONE.getCode(), "测试handle工厂");
    }

    @GetMapping("/factory/two")
    public String test2() {
        log.info("test2");
        return producedHandlerFactory.produceHandler(HandlerTypeEnum.HANDLER_TWO.getCode(), "测试handle工厂");
    }
}

测试1结果:

调用测试类1

测试2结果

调用测试类2

查看日志

在这里插入图片描述

总结

以上简单演示了工厂类的一个写法,这种写法可以方便的管理我们的自定义工人,可以便捷的将我们的代码插入到任何我们需要添加处理的地方,并且可以根据不同的场景去使用不同的实现。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值