使用Spring配置抽象工厂的实现类

2023-12-15

对于我的应用程序,我有一个Scale接口和实现该接口的多个类,例如NormalizedScale, LogScale等等。在我的一项服务中,我需要创建许多 Scale,并且我想使用 Spring 来定义它应该创建 Scale 的哪个实现。我将如何实现这样的事情?

--

我本来想建一个工厂ScaleFactory,就像在抽象工厂模式中一样,我可以称之为ScaleFactory.getScale()获取我在 Spring XML 中配置的任何实现的 Scale:

class ScaleFactory {
    Class<? extends Scale> scaleImplClass;
    public static Scale getScale() {
        return scaleImplClass.newInstance();
    }
}


Scale myScale = ScaleFactory.getScale();

但是使用这种方法,我如何从 Spring XML 配置 ScaleFactory 应使用哪个实现?

--

另一种选择是使ScaleFactory a @Service,然后将 ScaleFactory 自动连接到我的服务中:

@Autowired
ScaleFactory scaleFactory;

...

Scale myScale = scaleFactory.getScale();

然后我可以使用 ScaleFactory 中的自动装配属性来定义scaleImplClass。但这看起来很奇怪,因为我的工厂也是一个服务,并且我有该工厂的一个实例。

--

另一种方法是让Class scaleImplementationClass我的财产service而不是 ScaleFacotry 并使用 ScaleFactory,如下所示:

@Value("${scaleImplementationClass}")
Class scaleImplementationClass

...

Scale myScale = ScaleFactory.getScale(scaleImplementationClass);

但工厂就毫无意义了,因为我也可以运行scaleImplementationClass.newInstance().


有几种不同的类似 Spring 的方法可以处理这个问题。我个人采用的方法看起来有点像这样:

public interface ScaleFactory {

    public Scale newInstance();
    public String type();

}

public class FirstScaleFactory implements ScaleFactory {

    public Scale newInstance() {
        return new FirstScale();
    }

    public String type() {
        return "first";
    }    

}

public class SecondScaleFactory implements ScaleFactory {

    public Scale newInstance() {
        return new SecondScale();
    }

    public String type() {
        return "second";
    }    

}

public class ScaleManager {

    private final Map<String, ScaleFactory> factories;

    @Autowired
    public ScaleManager(List<ScaleFactory> factories) {
        this.factories = factories.stream()
            .collect(Collectors.toMap(f -> f.type(), Function::identity));
    }

    public Scale newInstance(String type) {
        return Optional.ofNullable(factories.get(type))
            .map(factory -> factory.newInstance())
            .orElseThrow(IllegalArgumentException::new);
    }

}

通过这种方法,您的ScaleManager是一个标准 Spring bean,可以连接到任何需要缩放实例的类。在初始化时,它获取所有ScaleFactories在 Spring 上下文中定义,并将它们自动装配为List<ScaleFactory>,然后转换为Map(其中ScaleFactory类型是关键)。这避免了您需要担心的类名Scale,并让您能够稍后更改它们(只要您保留type关键一致)`

Your ScaleFactory然后实现就可以做任何他们需要做的事情。例如,如果您有一种类型Scale你知道它是不可变的,你可以让工厂每次都返回相同的实例。或者,您可以让每个调用返回一个单独的实例 - 的实例化Scale取决于实施依赖工厂。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Spring配置抽象工厂的实现类 的相关文章

随机推荐

  • 在 python 中打开并显示适合图像

    import matplotlib pyplot as plt from astropy io import fits def openfit b hdu list fits open b hdu list info image data
  • 使用 jQuery 获取点击颜色的十六进制值

    我想知道如何使用 jQuery 制作一个颜色选择器 它允许您单击页面上的某个位置并返回您单击的颜色的十六进制颜色值 我知道使用 javascript 或 jquery 都是可能的 因为它们不仅有很多颜色选择器插件 而且我有一个具有相同功能的
  • 如何在“ExecuteGroovyScript”处理器中使用“DBCPConnectionPoolLookup”?

    我想在 ExecuteGroovyScript 处理器中使用 DBCPConnectionPoolLookup 控制器服务 我设置 数据库名称 但我收到这个错误 这是 ExecuteGroovyScript 配置 I found someo
  • 将数组(元素组合)划分为自定义分区的所有方法

    我想将 n 个元素的数组划分为给定大小的子数组 并包含所有可能的元素组合 例如 Array 1 2 3 4 可以是 n 个元素 1 给定尺寸模式 仅作为示例 可能会有所不同 2 subarrays 2 elements 预期结果 1 2 3
  • 增加图像中文本行之间的间距

    我有一个单行距文本段落的输入图像 我正在尝试实现类似行间距选项的功能 以增加 减少 Microsoft Word 中文本行之间的间距 当前图像是单倍行距 如何将文本转换为双倍行距 或者说 5空间 本质上 我试图动态地重组文本行之间的间距 最
  • 控制台鼠标输入不起作用

    我正在使用 Visual Studio 开发一个 C 控制台项目 其中鼠标负责执行所有输入操作 它在 Windows 7 上运行良好 但在 Windows 10 上则不行 我将向您展示一些代码 这是我的实际代码的非常简化的版本 但这里是一样
  • Symfony2 - FOSUserBundle - 多个登录位置

    我正在使用 FOSUserBundle 并且我需要能够从 2 个不同的路由 或更多 登录 这些路线将有不同的模板 并且登录到不同的区域 登录之间唯一的区别是所需的权限 路线将类似于 site com 登录 site com admin lo
  • ApiController的自动测试

    我有一个ApiController并想通过包括路由在内的单元测试来测试它 一个例子 RoutePrefix prefix public class Controller ApiController HttpGet Route id1 pub
  • 在 C# 中手动取消固定 byte[]?

    在下面的代码中 client Connect Receive 似乎永久固定 byte 结果 导致内存永远不会被释放 因为它始终被固定 我正在寻找一种方法来告诉 C 结果在 this OnReceive 中使用后不再需要固定 但我找不到执行此
  • .NET 中不同线程之间共享的列表

    我在一个类中有一个静态列表 它将由不同的线程访问 每个线程从列表中添加 读取和删除自己的唯一项目 我想知道我是否必须担心使这个变量线程安全 因为即使同一个 List 对象在线程之间共享 它们也只会修改自己的唯一项目 你肯定必须通过以下方式实
  • 雷达动画安卓

    所以事情就是这样 我正在监视某些距离 并且我想将它们显示在雷达动画中 基础雷达图像是这样的像这样 不完全是 其中每个圆圈表示一个距离范围 这个想法是随着距离的变化 点向圆圈移动 我最初的方法是对同一雷达制作不同的图像 每个圆圈上都有一个点
  • 如何部署混合 C++/Java (JNI) 应用程序?

    tl dr C 插件需要调用 Java jar 库 如何将其部署给用户而不让用户太头疼 我正在为 Qt 应用程序编写 Qt 插件 该插件需要调用现有的 Java 库 这需要跨平台 Win Mac Linux 和架构 32 位和 64 位 I
  • MongoDB 修复命令失败

    以前我的磁盘空间不足 mongodb 停止工作 然后我增加了磁盘大小 但 mongodb 没有开始工作 虽然我启用了日记功能 但我执行了以下命令sudo u mongodb mongod dbpath var lib mongodb rep
  • 使用正则表达式在 bash 中搜索和替换

    我看过这个例子 hello ho02123ware38384you443d34o3434ingtod38384day echo hello 0 9 其语法如下 variable pattern replacement 不幸的是pattern
  • 为什么0.1有时能准确打印,有时却不能?

    I run print 0 1 print 0 2 print 0 3 print 0 4 print 0 5 print 0 5 0 4 print 0 4 0 3 print 0 3 0 2 print 0 2 0 1 表明 0 1 0
  • Capistrano 损坏的 Gemfile.lock 错误

    我正在尝试使用 Capistrano 部署我的应用程序 但收到此错误 Your Gemfile lock is corrupt The following gem is missing from the DEPENDENCIES secti
  • 如何识别显示器的数量、位置或分辨率何时发生变化? [复制]

    这个问题在这里已经有答案了 我正在构建一些需要检测监视器配置何时发生变化的东西 这包括添加 删除显示器 移动显示器位置 与主屏幕相比 或显示器分辨率发生变化 最理想的方法是捕获一些 Windows 消息 如果有 这些消息在此类事件发生时会被
  • 无法使用数据透视表制定查询来组合单行中的不同行值

    下面是实际的表格 In the table above 1 FEID is the examination ID which remains same for one exam like ist semester examination o
  • Jquery 根据其子元素之一的值查找 XML 元素

    我正在开发一个简单的 XML 电话簿应用程序来学习 JQuery 但我不知道如何执行以下操作 当用户在文本框中输入联系人的名字时 我想查找该人的完整记录 XML 看起来像这样
  • 使用Spring配置抽象工厂的实现类

    对于我的应用程序 我有一个Scale接口和实现该接口的多个类 例如NormalizedScale LogScale等等 在我的一项服务中 我需要创建许多 Scale 并且我想使用 Spring 来定义它应该创建 Scale 的哪个实现 我将