使用工厂模式时,工厂应该包含验证逻辑,还是应该在调用上下文数据之前留给调用类来处理验证?
我有一个简单的工厂方法,但它依赖于传递给它的配置树来决定要实例化的对象。
可能存在这样的情况:配置xml可能格式正确,但工厂的预期格式不正确,我不知道应该在哪里验证。
答案 0 :(得分:2)
为什么不同时提供?通过这种方式,您可以将责任传递给调用者,以确定他是否希望输入验证。
从Apache Commons获取此示例 - InstantiateFactory
:
它的默认构造函数不提供验证:
InstantiateFactory(java.lang.Class classToInstantiate)
执行无验证的构造函数。
但是在getInstance
中提供验证:
static Factory getInstance (java.lang.Class classToInstantiate,java.lang.Class [] paramTypes,java.lang.Object [] args)
执行验证的工厂方法。
答案 1 :(得分:2)
使用工厂模式时,工厂应该包含验证逻辑,还是应该在调用上下文数据之前留给调用类来处理验证?
组织验证有两种不同的替代方法:
有一种单独的验证方法Validate(Config)
。在构造方法之前调用此方法,并返回Config
是否有效的信息。如果Validate
方法返回Config
有效,则调用构造方法。施工过程中的任何错误都被视为例外。
没有单独的验证方法。而是在需要时在构造方法内部进行验证。允许构造方法失败并返回构造对象或指示错误的结果。
使用几乎没有代码和性能开销的monad可以很好地实现第二个变体。
答案 2 :(得分:2)
验证是什么意思?是什么让你认为作为Factory设计模式实例一部分的代码与其他代码不同?
如果通过验证表示检查从用户或输入文件读取的输入值,答案是否:解析输入的代码负责验证,而不是随后使用的工厂读取值。
如果通过验证,您的意思是让Factory的工厂方法检查其调用者是否提供了符合这些方法前提条件的值,那么答案与对其参数强加先决条件的任何其他方法相同:共识Java的样式用于检查其前提条件的方法,并在不满足前提条件时抛出合适的RuntimeExceptions。