当使用工厂模式时,工厂itsel是否应该包含验证逻辑,还是应该让调用类在传入上下文数据之前处理验证?
我有一个简单的工厂方法,但它依赖于传递给它的配置树来决定要实例化哪个对象。
可能会出现配置xml格式良好的情况,但不是工厂所期望的正确格式,我不知道应该在哪里验证。
发布于 2016-01-02 13:49:20
当使用工厂模式时,工厂itsel是否应该包含验证逻辑,还是应该让调用类在传入上下文数据之前处理验证?
组织验证有两种不同的备选方案:
有一个单独的验证方法Validate(Config)
。在构造方法之前调用此方法,并返回Config
是否有效的信息。如果Validate
方法返回Config
是有效的,则调用构造方法。施工过程中的任何错误都被视为例外。
没有单独的验证方法。相反,当需要时,验证会在构造方法中进行。允许构造方法失败并返回已构造的对象或指示错误的结果。
第二个变体可以使用几乎为零代码和性能开销的monads很好地实现。
发布于 2016-01-02 19:07:27
你所说的验证是什么意思?是什么使您认为作为工厂设计模式实例的一部分的代码不同于任何其他代码?
如果您所说的验证意味着检查从用户或输入文件中读取的输入值,则答案是否定的:解析输入的代码负责验证,而不是随后使用读取值的工厂。
如果您所说的验证意味着让工厂的工厂方法检查它们的调用方是否提供了符合这些方法的先决条件的值,那么对其参数施加先决条件的任何其他方法的答案都是相同的:对于Java的一致样式是方法检查它们的先决条件并在不满足先决条件的情况下抛出一个合适的RuntimeException
。
现在,在实践中,这意味着一些输入值将被检查两次。首先通过输入验证代码,然后通过工厂的前提检查。这在一定程度上是将代码分解为模块的成本(这里是一个单独的输入模块和服务层)。
但它也允许支票以不同的方式报告,而这些方式更适合他们的目的。
发布于 2013-04-25 18:03:14
为什么不两者都提供呢?这样,您就可以将责任传递给调用者,以确定他是否需要验证他的输入。
以Apache Commons-InstantiateFactory
中的示例为例
它的默认构造函数不提供验证:
InstantiateFactory(java.lang.Class classToInstantiate) 构造函数,该构造函数执行不验证。
但是在getInstance
中提供了验证
静态工厂getInstance(java.lang.Class classToInstantiate,java.lang.Class[] paramTypes,java.lang.Object[] args) 执行验证的工厂方法。
https://stackoverflow.com/questions/16221010
复制相似问题