java – 将属性传递给Factory方法
作者:互联网
我有一个工厂方法,它返回一个接口的实现.问题是 – 实现具有不同的构造函数参数.
我的问题是 – 如何通过工厂方法将参数传递给接口的不同实现?
我有一个想法,但我不确定它是否有意义 – 将Properties对象传递给工厂方法?这样,每个接口实现都可以获得其构造函数所需的属性,而工厂接口将统一.
这有意义,还是有更好的解决方案?
我决定添加一个例子,所以我可以更好地澄清问题.
假设我们有接口SomeAlgorithm,我们有具体的算法,其中每个算法可能有不同的参数,例如
SomeAlgorithm algo = new Algo1();
SomeAlgorithm algo = new Algo2(noOfIterations);
SomeAlgorithm algo = new Algo3(precision, boundary);
我希望能够做类似的事情
SomeAlgorithm algo = AlgoFactory.getAlgo("algoName");
我处理不同参数的方法是
SomeAlgorithm algo = AlgoFactory.getAlgo("algoName", properties);
然后,如果算法具有参数(例如,Algo1没有参数),AlgoFactory可以将适当的属性传递给具体的算法构造函数.如果某些属性不存在,则可以传递默认值(如果算法中需要该值).
如您所见,我希望能够动态更改算法.用户将在运行时选择算法并传递适当的参数,这些参数将被放入属性对象中.
这有意义吗?
解决方法:
已编辑问题的更新(rev43552065-8ee8-47e8-bc96-c660c3836998):
您的示例不是典型的工厂模式.如果您需要通过名称引用三种算法并为特定算法提供特定参数,那么您为什么要使用工厂?你应该从着名的“Effective Java”一书中读到“第1项:考虑静态工厂方法而不是构造函数”.它描述了工厂方法的优点,我在你的例子中没有看到.
这个问题有很多解决方案,你可以在各种流行的项目中找到数百个例子.
例如,DriverManager类使用类似URL的字符串,其中包含变量格式的连接详细信息和带有高级选项的其他Properties对象(example).
工厂方法通常应该足够抽象以获得有效的实现,而无需为特定实现指定任何其他参数.它应该“隐藏”实现细节.
如果事实证明有必要传递其他/可选属性,则传递一个Properties对象是很常见的.
有不同的策略.例如,UrlConnection是一个抽象类.可以通过调用URL.openConnection()来检索实例,但是,许多选项只能通过将返回的UrlConnection转换为特定的子类型来设置,例如, HttpURLConnection类.
我相信没有适合所有情况的单一解决方案,我很确定许多解决方案,甚至可能在Java标准库中,都远非完美,但你应该真正实现一些简单而不是浪费太多时间问题.
标签:builder-pattern,java,design-patterns,factory-pattern 来源: https://codeday.me/bug/20190929/1832710.html