返回信息流场景是这样的,现在想有很多的 create 函数,类似于 createA1, createA2 之类的,返回结果都是 class A 或者是继承自 A 的类。这些 create 函数会在几个java文件里面,希望这些函数能通过类似于配置文件的方式制定用哪个。我现在想的实现方式是做一个工厂,然后有 create 函数的 java 在 static 块中 register 到这个工厂类,然后启动时根据用户的配置信息确认。但是这样的话 static块 需要加载,所以工厂类就和这几个 java 文件耦合在一起,以后想要添加其他 create 方法的时候,如果在新的 java 文件,就要手动修改工厂类的源代码。想问这种情况下有没有什么松耦合的解决方案?
这是一条镜像帖。来源:北邮人论坛 / java / #53434同步于 2016/10/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
求问一个关于 工厂模式 的问题
hyx2011
2016/10/8镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 dss886 的大作中提到: 】
: 没太懂…
比如说现在有很多 strategy, 希望用户通过配置文件指定所需的 strategy 。假设现在有 SimpleStrategy.java 和 ComplexStrategy.java 两个文件,每个文件里都有 3-4 个 strategy。现在我的实现方式是加一个 factory 类,类里有一个 register 方法,把 strategy 的方法名和对应的 Method 挂钩,然后在每个 strategy.java 里的 static 块中调用 register 去注册。但是java类的 static 块不可能在不引用的情况下调用,所以就需要将这几个 java 类硬编码到代码里。我想知道有没有什么办法去避免这种情况?
感觉这个可以很典型的去用反射去做啊
只不过配置文件里面配的是createA1,createA2然后class.forName对应的类,拿到类之后invoke这些构造方法就有实例了
甚至参数都可以放在配置里面
将来扩展只用添加create方法对应的类就行
我用的就是反射,但是问题是怎么找到 class.forName 的参数?我想把添加的过程放在 java 类(比如SimpleStrategy) 里面,这就又回来原来的问题;如果放在工厂类里是可以,但是每次添加或者删除类的时候,都需要修改工厂类
【 在 ytinrete 的大作中提到: 】
: 感觉这个可以很典型的去用反射去做啊
: 只不过配置文件里面配的是createA1,createA2然后class.forName对应的类,拿到类之后invoke这些构造方法就有实例了
: 甚至参数都可以放在配置里面
: ...................
额,不写网站,所以不想用感觉用了有点太重了= =
【 在 nuanyangyang 的大作中提到: 】
: 楼主试试spring framework吧。
【 在 hyx2011 的大作中提到: 】
: 我用的就是反射,但是问题是怎么找到 class.forName 的参数?我想把添加的过程放在 java 类(比如SimpleStrategy) 里面,这就又回来原来的问题;如果放在工厂类里是可以,但是每次添加或者删除类的时候,都需要修改工厂类
:
class.forName 的参数?不就是类名么,这个不应该事先就知道的么,或者是运行时拿得到要不然你怎么知道要用哪个create方法?你前面不是说用配置文件么,那当然就是配置到那个里面去了啊。
不是很明白。
【 在 hyx2011 的大作中提到: 】
: 额,不写网站,所以不想用感觉用了有点太重了= =
:
只用spring-context,不重。
楼主你的描述好谜啊。。夹生英语233
【 在 hyx2011 的大作中提到: 】
: 场景是这样的,现在想有很多的 create 函数,类似于 createA1, createA2 之类的,返回结果都是 class A 或者是继承自 A 的类。这些 create 函数会在几个java文件里面,
这是想表达接口的意思?
: 希望这些函数能通过类似于配置文件的方式制定用哪个。
这个有好多种方式。。随便都可以
读配置文件,然后初始化想要的类写进bean里面就可以了
: 我现在想的实现方式是做一个工厂,然后有 create 函数的 java 在 static 块中 register 到这个工厂类,然后启动时根据用户的配置信息确认。
。。。。
: 但是这样的话 static块 需要加载,所以工厂类就和这几个 java 文件耦合在一起,以后想要添加其他 create 方法的时候,如果在新的 java 文件,就要手动修改工厂类的源代码。想问这种情况下有没有什么松耦合的解决方案?
有接口就没这问题