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

Mar*_*ace 8 java design-patterns factory

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

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

可能存在这样的情况:配置xml可能形成良好,但不是工厂期望的正确格式,我不知道应该在哪里验证.

Lig*_*man 5

使用工厂模式时,工厂本身是否应该包含验证逻辑,还是应该由调用类在传递上下文数据之前负责验证?

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

  1. 验证作为一个单独的过程

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

  1. 验证作为施工过程的一部分

没有单独的验证方法。相反,验证会在需要时在构造方法内部进行。构造方法允许失败并返回构造对象或指示错误的结果。

第二种变体可以使用 monad 很好地实现,代码和性能开销几乎为零。


Jop*_*ops 2

为什么不两者都提供呢?这样,您就可以将责任传递给调用者,决定他是否希望其输入得到验证。

以 Apache Commons 为例InstantiateFactory

它的默认构造函数不提供验证:

InstantiateFactory(java.lang.Class classToInstantiate)

执行验证的构造函数。

但提供验证getInstance

静态工厂getInstance (java.lang.Class classToInstantiate, java.lang.Class[] paramTypes, java.lang.Object[] args)

执行验证的工厂方法。