我试图看看是否有可以解决这个问题的设计模式:
我创建了一个带有属性a,b和c的抽象类A.我有另一个类B,它扩展了类A并添加了更多属性:x,y,z。然后我有另一个C类再次扩展A并添加i,j,k。最后,我有一个工厂方法,确定创建B或C的实例,以及我需要帮助的部分。该工厂方法如何或应该返回:如果它返回A的实例,我不知道哪个特定实例是创建B或C?我需要这个工厂方法来创建一个具体的实例。现在,我知道我可以编写像createB或createC这样的静态方法,但我正在寻找一种更通用的解决方案,也许是另一种设计模式。
更新:我想知道具体类的原因是我需要将此对象传递给前端jsp。该JSP需要知道实例化了哪个特定的类,以便它可以调用适当的getter。
答案 0 :(得分:0)
根据您的描述,B和C与A没有任何共同点。您已经提到每个类都有特定的属性,但没有关于它们的共同点/它们的相关性。如果您的类之间没有关系,则不应使用继承。
但是,如果您的问题中没有提及您的共同关系,那么factory method pattern可能就是您所寻找的。 p>
答案 1 :(得分:0)
在阅读问题时,唯一想到的是抽象工厂模式:
答案 2 :(得分:0)
工厂方法应返回A的实例。如果需要知道具体对象是否为B或C,则可以使用instanceof运算符,即反射模式。理想情况下,您不需要知道您是否有B或C;该逻辑应该全部由A中方法的多态处理。
答案 3 :(得分:0)
在工厂模式描述中提到的确切点是警告。
当你设计一个应用程序时,只要想想你是否真的需要一个工厂来创建对象。使用它可能会给您的应用带来不必要的复杂性。无论如何,如果你有许多相同基类型的对象,并且你主要将它们作为抽象对象进行操作,那么你需要一个工厂。我的代码应该有很多代码,如下所示,重新考虑。
if (genericProduct typeof ConcreteProduct)
((ConcreteProduct)genericProduct).doSomeConcreteOperation();
答案 4 :(得分:0)
我建议Builder pattern
根据设置为Builder的专业字段知道要构建的对象。
答案 5 :(得分:0)
我会保持工厂模式。所以返回类型将是Abstract A类。 B& C还应通过Proxy Pattern继承其属性。
所以让CAble& BAble接口并使用C& B作为A的实例(因为它们都是由同一工厂生成的),然后铸造B& C充当他们的界面描述。
干杯!
更新:
我想我已经找到了你需要的东西,想象如下: 在学校页面。 学生和学生有一个普遍的观点。教授们都有共同的和个别的领域,但共同的要求是 schoolMember 。
class SchoolMember // The return type of your Factory
-name
+getView():SchoolMemberView // Will be used by the View//View Model
Interface Professor
getProfession()
Interface Student
getSemester()
class FacultyMamber: SchoolMember,Professor
-profession
+getView():SchoolMemberView
class UniStudent: SchoolMember,Student
-semmester
+getView():SchoolMemberView