我需要重构几个长方法。
在我们的应用程序中,我们制作了一系列文档,所有文档都具有从应用程序中的值获得的不同值。所有这些代码现在都在一个帮助器类中,但是,我想使用工厂类来生成文档。工厂的行为如果A
,则调用factory.getDocument("A")
,如果B
,则调用factory.getDocument("B")
。
我的问题是,为了构建文档,我需要从我的数据库中获取值,并且我在某处(或有人建议我)读到服务不应该包含在工厂类中。如果是这种情况,我该如何构建完整的对象?
在我的工厂类中进行service / db调用是否可以接受?
如果没有,那么我应该为构建对象所需的值传递参数(例如factory.getDocument(a,b,c,d)
还是inputobject
)?这似乎打败了拥有工厂类的目的,因为调用者需要有关如何制作文档A
的信息,所以我宁愿避免这种方法。我希望调用方法对文档的制作方式一无所知。
我有什么选择?
答案 0 :(得分:1)
我没有看到从工厂访问数据库有任何问题。工厂的目的是根据一些输入生成对象。那么如果输入来自数据库怎么办?
答案 1 :(得分:1)
我有点不同意使用Factory模式创建一个相同的类并用不同的数据填充它的想法。根据某些标准创建Java类并填充它是不同的问题,因此它们应由不同的实体处理。
理想情况下,Factory类仅负责根据某种类型的用户输入实例化正确的实体。在您的示例中,如果您有不同类型的Document类实现,我会说只使用Factory类。填充文档类应由单独的实体处理(如果需要,可以是单例)。
答案 2 :(得分:0)
好的,问题已被编辑,所以我会改变答案。
如果您希望调用者不知道创建这些参数的参数,则代码中的某些内容需要知道文档“A”和“B”的含义。没有理由说这个逻辑不能包含在你的工厂中,或者至少工厂负责查找如何创建“A”和“B” - 这对工厂模式来说似乎非常合理。
我仍然会通过单例访问数据库,即使这只是为了获得连接。请参阅:Java Singleton Pattern
答案 3 :(得分:0)
关注点分离表示您应该使用抽象工厂模式,并根据文档类型选择正确的模式。