设计模式系列一工厂模式
文章目录
前言
针对于需要制定全局代码增加额外操作的需要,又具备多个不同的场景;可以通过使用工厂模式进行我们的逻辑实现管控;
提示:以下是本篇文章正文内容,下面案例可供参考
一、定义工厂类以及其下属
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结果:

测试2结果

查看日志

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

被折叠的 条评论
为什么被折叠?



