BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #53434同步于 2016/10/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

求问一个关于 工厂模式 的问题

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