工厂模式是否应包含验证逻辑

时间:2013-04-25 17:24:37

标签: java design-patterns factory

使用工厂模式时,工厂应该包含验证逻辑,还是应该在调用上下文数据之前留给调用类来处理验证?

我有一个简单的工厂方法,但它依赖于传递给它的配置树来决定要实例化的对象。

可能存在这样的情况:配置xml可能格式正确,但工厂的预期格式不正确,我不知道应该在哪里验证。

3 个答案:

答案 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)

  

使用工厂模式时,工厂应该包含验证逻辑,还是应该在调用上下文数据之前留给调用类来处理验证?

组织验证有两种不同的替代方法:

  1. 验证为单独的流程
  2. 有一种单独的验证方法Validate(Config)。在构造方法之前调用此方法,并返回Config是否有效的信息。如果Validate方法返回Config有效,则调用构造方法。施工过程中的任何错误都被视为例外。

    1. 验证作为施工过程的一部分
    2. 没有单独的验证方法。而是在需要时在构造方法内部进行验证。允许构造方法失败并返回构造对象或指示错误的结果。

      使用几乎没有代码和性能开销的monad可以很好地实现第二个变体。

答案 2 :(得分:2)

验证是什么意思?是什么让你认为作为Factory设计模式实例一部分的代码与其他代码不同?

如果通过验证表示检查从用户或输入文件读取的输入值,答案是:解析输入的代码负责验证,而不是随后使用的工厂读取值。

如果通过验证,您的意思是让Factory的工厂方法检查其调用者是否提供了符合这些方法前提条件的值,那么答案与对其参数强加先决条件的任何其他方法相同:共识Java的样式用于检查其前提条件的方法,并在不满足前提条件时抛出合适的RuntimeExceptions。