当前位置: 首页 > news >正文

设计模式 - 静态工厂模式 + 策略模式,

1静态工厂模式 

 1.1.提供了一种创建对象的方式,将对象的创建过程封装在一个工厂类中,而不是直接在客户端代码中实例化对象。

   1.2解决创建对象和销毁对象的操作 。 使用时仅需 factory.getXXX  即可获得相应的对象,不需要再管理创建销毁对象。

2.策略模式 

   根据不同的业务场景可以自定义不同的策略和算法,减少代码的耦合性,

3. 静态工厂 + 策略模式,

自动实现 策略的的注册和使用,无需改动现有的代码即可实现 策略新增和对象创建 

3.1  具体代码实现方式 

  (1)  注册全局静态变量和自定义注解 (注解的目的为 无需 实现 implements Strategy  )

       

public class SysConstant {public static final String PACKAGE_NAME = "com.hzq.test";// 策略模板public static final  Map<String, BusinessStrategy> STRATEGY_CENTER = Maps.newConcurrentMap();}

  自定义注解,便于静态工厂扫描对应的策略,无需 手动注册 

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface BusinessType {String value();
}

自定义接口 ,当 后续需要新增的 策略 需要根据 基础的 超类 接口定义实现( 其他的策略都是当前策略的多态) 

import java.util.List;public interface BusinessStrategy {}

(2) 建立业务策略静态工厂,对于不同的 业务进行注册 后面使用时只要注入静态工厂后,根据业务类型即可拿出对应的策略 

import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.ReflectUtil;
import com.eforkrobot.modules.wcs.common.annotation.BusinessType;
import com.eforkrobot.modules.wcs.common.constant.SysConstant;
import org.springframework.stereotype.Component;import java.util.Set;/*** @Author:* @Date: * @Description: 业务策略工厂**/@Component
public class BusinessStrategyFactory {// 默认业务策略public BusinessStrategy getDefaultStrategy() {return new BaseValidateStrategy();}public BusinessStrategy getStrategy(String businessType) {return SysConstant.STRATEGY_CENTER.computeIfAbsent(businessType, k -> new BaseValidateStrategy());}// 注册业务策略public static void registerStrategy(String businessType, BusinessStrategy strategy) {SysConstant.STRATEGY_CENTER.put(businessType, strategy);}static {Set<Class<?>> classes = ClassUtil.scanPackageByAnnotation(SysConstant.PACKAGE_NAME, BusinessType.class);for (Class<?> clazz : classes) {BusinessType annotation = clazz.getAnnotation(BusinessType.class);SysConstant.STRATEGY_CENTER.put(annotation.value(), (BusinessStrategy) ReflectUtil.newInstance(clazz));}}}

 tip:  优化  将  策略注册交个spring管理,防止策略中报异常导致事务失效的 现象 

  @PostConstructpublic void initStrategies() {// 从Spring容器中获取所有带有@BusinessType注解的BeanMap<String, Object> strategyBeans = applicationContext.getBeansWithAnnotation(BusinessType.class);strategyBeans.forEach((beanName, bean) -> {if (bean instanceof BusinessStrategy) {Class<?> clazz = bean.getClass();BusinessType annotation = clazz.getAnnotation(BusinessType.class);if (annotation != null) {// 这里存储的是Spring管理的Bean,包含AOP代理registerStrategy(annotation.value(), (BusinessStrategy) bean);}}});}

 默认策略模板  -- 可以自定义一个


import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;import java.util.List;
import java.util.Objects;/*** @Author:* @Date:* @Description: **/
@RequiredArgsConstructor
@Component
@Slf4j
public class BaseValidateStrategy implements BusinessStrategy {}

(3) 使用时只需要  注入 factory 即可,无需  再关注  策略方法 对象创建   以后只需要修改策略 即可,无需修改业务代码 

 private final BusinessStrategyFactory factory;BusinessStrategy strategy = factory.getDefaultStrategy();List<BusinessTicketBO> businessTickets = strategy.containerValidate(businessTicketBOList);

http://www.dtcms.com/a/358292.html

相关文章:

  • 【Java后端】MySQL 常见 SQL 语句优化指南
  • AI 赋能综合能源管理系统:开启智慧能源新时代
  • 掌握表单:React中的受控组件与表单处理
  • 详解Vue2、Vue3与React的Diff算法
  • 【Android】OkHttp发起GET请求 POST请求
  • React Router 6 获取路由参数
  • 【自然语言处理与大模型】如何进行大模型多模态微调
  • 【ASP.NET Core】双Token机制在ASP.NET Core中的实现
  • OpenCV 图像形态学操作与边缘检测实战指南
  • ESPTimer vs GPTimer:ESP32 定时器系统深度解析
  • 机器学习 - Kaggle项目实践(6)Dogs vs. Cats Redux: Kernels Edition 猫狗二分类
  • 最强分布式锁工具:Redisson
  • Git 的核心工作流程(三区域模型)
  • github同一台电脑支持两个或以上的ssh账户(macos或Linux系统),解决Key is already in use问题
  • 医院排班|医护人员排班系统|基于springboot医护人员排班系统设计与实现(源码+数据库+文档)
  • 苍穹外卖Day7 | 缓存商品、购物车、SpringCache、缓存雪崩、缓存套餐
  • SpringCloud Alibaba微服务--Sentinel的使用
  • docker 部署Skywalking
  • 基于大模型与 PubMed 检索的光谱数据分析系统
  • 大语言模型的“可解释性”探究——李宏毅大模型2025第三讲笔记
  • Java类加载与JVM详解:从基础到双亲委托机制
  • idea 普通项目转换成spring boot项目
  • Python实现半角数字转全角数字的完整教程
  • 《中国棒垒球》垒球世界纪录多少米·垒球8号位
  • Visual Studio(vs)免费版下载安装C/C++运行环境配置
  • LeetCode 287.寻找重复数
  • Java试题-选择题(23)
  • 【LeetCode 热题 100】62. 不同路径——(解法四)组合数学
  • 聊一聊 .NET 的 AssemblyLoadContext 可插拔程序集
  • rhel-server-7.9-x86_64-dvd.iso