工厂类进行数据库/服务调用

时间:2011-07-16 05:19:21

标签: java design-patterns factory

我需要重构几个长方法。

在我们的应用程序中,我们制作了一系列文档,所有文档都具有从应用程序中的值获得的不同值。所有这些代码现在都在一个帮助器类中,但是,我想使用工厂类来生成文档。工厂的行为如果A,则调用factory.getDocument("A"),如果B,则调用factory.getDocument("B")

我的问题是,为了构建文档,我需要从我的数据库中获取值,并且我在某处(或有人建议我)读到服务不应该包含在工厂类中。如果是这种情况,我该如何构建完整的对象?

在我的工厂类中进行service / db调用是否可以接受?

如果没有,那么我应该为构建对象所需的值传递参数(例如factory.getDocument(a,b,c,d)还是inputobject)?这似乎打败了拥有工厂类的目的,因为调用者需要有关如何制作文档A的信息,所以我宁愿避免这种方法。我希望调用方法对文档的制作方式一无所知。

我有什么选择?

4 个答案:

答案 0 :(得分:1)

我没有看到从工厂访问数据库有任何问题。工厂的目的是根据一些输入生成对象。那么如果输入来自数据库怎么办?

答案 1 :(得分:1)

我有点不同意使用Factory模式创建一个相同的类并用不同的数据填充它的想法。根据某些标准创建Java类并填充它是不同的问题,因此它们应由不同的实体处理。

理想情况下,Factory类仅负责根据某种类型的用户输入实例化正确的实体。在您的示例中,如果您有不同类型的Document类实现,我会说只使用Factory类。填充文档类应由单独的实体处理(如果需要,可以是单例)。

答案 2 :(得分:0)

好的,问题已被编辑,所以我会改变答案。

如果您希望调用者不知道创建这些参数的参数,则代码中的某些内容需要知道文档“A”和“B”的含义。没有理由说这个逻辑不能包含在你的工厂中,或者至少工厂负责查找如何创建“A”和“B” - 这对工厂模式来说似乎非常合理。

我仍然会通过单例访问数据库,即使这只是为了获得连接。请参阅:Java Singleton Pattern

答案 3 :(得分:0)

关注点分离表示您应该使用抽象工厂模式,并根据文档类型选择正确的模式。