Java:通过Spring创建基于OCP的工厂?

标签 java spring factory

我有以下代码:

public IFoo getFoo(Type type) // Type is an enum containing A, B etc.
{
    switch(type)
    {
        case A: return new Foo1(); // implements IFoo
        case B: return new Foo2(); // implements IFoo
        etc.
    } 
}

这显然违反了OCP,所以我需要重构;另外,我现在需要返回由 Spring 容器管理的原型(prototype) bean。为了实现这一目标,我可以想到以下选项:

1) 创建这个类AppContextAware;创建一个 Map,其中 String 是 bean id;在 Spring Config 中将这些 bean 定义为原型(prototype),并在 Spring config 中定义此 Map 并将其注入(inject)此类中,然后从该映射中获取给定枚举的 bean id 并使用它从 AppContext 中获取 bean,

2) 类似的方法,但对于 Map 中的值,使用 TargetSource,它有一个我在 getTarget() 中调用的抽象方法,并使用 lookup-method 作为每个 TargetSource 定义的抽象方法来连接定义的原型(prototype) bean,

3)类似的方法,但我使用 FactoryBean 而不是 TargetSource。

在 #1 中,我的类依赖于 AppContext,但在其他方法中则不然。所以我倾向于#2 或#3,但是该选择哪一个呢?或者还有其他我没有想到的更好的方法吗?

最佳答案

无论如何,我最终使用了#1,因为它是最简单的,并且创建的 bean 数量较少。

关于Java:通过Spring创建基于OCP的工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13134526/

相关文章:

Java:BufferedReader 在 close() 上永远挂起,而 StreamDecoder 不考虑线程中断

java - 为什么 boolean 变量不显示 false 的任何结果?

java - 在 ControllerAdvice 之前捕获反序列化异常

c++ - 静态本地数据的延迟初始化

java - Java中数字的最大质因数

打包成 jar 时找不到 Java JSoup 库

java - 如何在maven、Spring-boot中解决 "Conflicting lifecycle mapping"

java - 由于特定的 Spring JMS 配置,无法从 Tomcat 取消部署

PHPUnit Laravel InvalidArgumentException : Unable to locate factory with name [default] [App\User]

c# - 创建一个 C# 工厂