我有一个来自GUI的对象guiObject
。基于其数据字段,我需要实例化适当类的domainObject
。它可以是DomainClassA
或DomainClassB
。
DomainClassA
有一个整数构造函数参数intParamA
(来自guiObject.fieldA
)。
DomainClassB
有一个整数构造函数参数intParamB
(来自guiObject.fieldB
)。
为了解决这个问题,我制作了AbstractFactory
,其中包含guiObject
中的必填字段,使用DomainClassAFactory
中的相应字段实例化DomainClassBFactory
或GuiClass
并重新调整。反过来,这些工厂中的任何一个create()
都已正确实例化domainObject
。
但现在,根据guiObject.fieldC
,我需要在实例化intParamA
之前更改intParamB
和domainObject
(即减1)。为了实现这一点,我必须为每个DomainClass
的每个不同类型的“参数更改”创建单独的工厂,然后创建生成正确工厂的单独抽象工厂。这听起来很丑陋,看起来很难看。
正确的设计应该是什么?
答案 0 :(得分:4)
除非您需要所有这些图层,否则请让工厂询问guiObject
并返回正确的类型。
过度分析导致大多数应用程序根本不需要的东西。只有在严格必要时才添加额外的抽象层。他们通常不是。
答案 1 :(得分:1)
我个人将所有这些逻辑放在原始工厂中,而不是试图将其展开:
public DomainObj getDomainObj(GuiObject guiObject) {
int param = guiObject.someField ? guiObject.intParamA : guiObject.intParamB;
param = guiObject.fieldC ? param : param - 1;
return guiObject.someField ? new DomainClassA(param) : new DomainClassB(param);
}