3

我正在尝试查看是否有可以解决此问题的设计模式:

我创建了一个具有属性 a、b 和 c 的抽象类 A。我有另一个 B 类,它扩展了 A 类并添加了更多属性:x、y、z。然后我有另一个类 C,它再次扩展 A 并添加 i、j、k。最后,我有一个工厂方法来确定创建 B 或 C 的实例,这就是我需要帮助的部分。这个工厂方法应该如何或返回什么:如果它返回一个 A 的实例,我就不知道创建了哪个特定实例 B 或 C?我需要这个工厂方法来创建一个具体的实例。现在,我知道我可以编写像 createB 或 createC 这样的静态方法,但我正在寻找更通用的解决方案,也许是另一种设计模式。

更新:我想知道具体类的原因是我需要将此对象传递给前端 jsp。该 JSP 需要知道实例化了哪个特定类,以便它可以调用适当的 getter。

4

6 回答 6

1

我会保持应有的工厂模式。所以返回类型将是 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
于 2012-10-29T16:59:14.830 回答
0

我建议一个Builder pattern会根据设置为 Builder 的专用字段知道要构建的对象。

于 2012-10-29T16:49:30.097 回答
0

根据您的描述,B 和 C 与 A 没有任何共同之处。您已经提到每个类都有特定的属性,但没有关于它们的共同点/它们之间的关系。如果您的类之间没有关系,则不应使用继承。

但是,如果存在您在问题中没有提到的共同关系,那么工厂方法模式可能就是您要寻找的。

于 2012-10-29T16:39:39.780 回答
0

阅读问题时唯一想到的是抽象工厂模式:

http://en.wikipedia.org/wiki/Abstract_factory_pattern

于 2012-10-29T16:39:51.283 回答
0

工厂方法应该返回一个A的实例。如果你想知道具体的对象是B还是C,你可以使用instanceof操作符,也就是反射模式。理想情况下,您不需要知道自己是 B 还是 C;该逻辑都应该由 A 中的方法的多态性来处理。

于 2012-10-29T16:41:14.440 回答
0

正是工厂模式描述中提到的警告点。

当你设计一个应用程序时,想想你是否真的需要一个工厂来创建对象。也许使用它会给您的应用程序带来不必要的复杂性。无论如何,如果您有许多相同基本类型的对象并且您主要将它们作为抽象对象进行操作,那么您需要一个工厂。我你的代码应该有很多类似下面的代码,重新考虑一下

if (genericProduct typeof ConcreteProduct)
    ((ConcreteProduct)genericProduct).doSomeConcreteOperation();

来源:http ://www.oodesign.com/factory-method-pattern.html

于 2012-10-29T16:42:22.187 回答