Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设计模式-具有通用和专用属性的类_Java_Design Patterns_Object Oriented Analysis - Fatal编程技术网

Java 设计模式-具有通用和专用属性的类

Java 设计模式-具有通用和专用属性的类,java,design-patterns,object-oriented-analysis,Java,Design Patterns,Object Oriented Analysis,我想看看是否有一种设计模式可以解决这个问题: 我创建了一个具有属性A、b和c的抽象类A。我有另一个类B扩展了类A并添加了更多属性:x,y,z。然后我有另一个C类,它再次扩展了A,并添加了I,j,k。最后,我有一个工厂方法来确定创建B或C的实例,这就是我需要帮助的部分。这个工厂方法应该如何返回或返回什么:如果它返回A的一个实例,那么我就不知道哪个特定实例是B或C创建的?我需要这个工厂方法来创建一个具体的实例。现在,我知道我可以编写像createB或createC这样的静态方法,但我正在寻找一个更通

我想看看是否有一种设计模式可以解决这个问题:

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


更新:我想知道具体类的原因是我需要将此对象传递给前端jsp。JSP需要知道实例化了哪个特定的类,这样它才能调用相应的getter。

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


但是,如果您的问题中没有提到一种常见的关系,那么这可能就是您所寻找的关系。

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


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

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

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

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

来源:

我会建议一个基于为构建器设置的专用字段知道要构建什么对象的应用程序。

我会保留工厂模式。因此,返回类型将是类的抽象类型。B&C也应该通过继承他们的财产

因此,制作CAble&BAble接口并使用C&B作为A的实例(因为它们都是由同一家工厂生成的),然后将B&C转换为它们的接口描述

干杯

更新:

我想我已经知道你需要什么了,想象一下: 在学校的网页上。 对学生和教授有一种普遍的看法,既有共同的领域,也有各自的领域,但共同的要求是学校成员


我已经提到B类和C类都扩展了A,所以B和C都有属性A、B和C以及一些附加属性,Factory的问题是它会返回一个类A的实例,而我正在寻找更具体的B或CI,我猜不是。生成器构建复合对象,并在对象构造复杂时使用。从这个问题中,我们可以理解用户构造对象没有问题。实际上,我需要知道具体实例的唯一原因是因为我将这个实例传递给前端jsp,而jsp将调用属性的getter进行呈现。这是可伸缩性中的反模式。想象一下“typeof”的5k条件。嗨,我有一个类似的问题。但是以你的例子来说,我不明白如果工厂只返回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