目前我有3个类,其中大多数变量是相同的。所有变量都有getter和setter。我需要根据提供的数据类型变量 Year 创建类的对象,并在十多种方法中传递该对象。让我们举一个例子。
我们有三个类 ClassA , ClassB , ClassC 。如果我们通过年份 2017 ,那么我需要ClassA的对象。如果我们通过年份 2016 ,那么我需要ClassB的对象,并且在其他所有年份我们都需要 ClassC的对象。
然后我们需要在所有 10个方法中传递该对象。 我们来看两种方法。
public void method1(int a,int b, classA / B / C的对象)。
public void method2(int a,int b, classA / B / C的对象)。
处理对象的方法和在对象中设置一些变量。
但有一个问题是我不想在 ClassA,ClassB,ClassC 中扩展类或实现接口,因为< strong> ClassA,ClassB,ClassC 由XSD文件制作,我不想在类中更改。
请让我知道完美符合我要求的设计模式。
答案 0 :(得分:1)
要根据年份创建任何A / B / C类的实例,您可以选择工厂模式。这应该是非常直截了当的。
问题的第二部分是将A,B,C类的对象传递给您的某些方法。这可以通过两种方式完成。
如果你的类是相关的,即它们实现了一些通用接口或抽象类,你可以编写你的方法来接受接口或抽象类,即
public class A implements ICommonInterface {}
public class B implements ICommonInterface {}
public class C implements ICommonInterface {}
public void method1(int a, int b, ICommonInterface object){}
或者他们扩展了一些常见的类
public class A extends CommonClass {}
public class B extends CommonClass {}
public class C extends CommonClass {}
public void method1(int a, int b, CommonClass object){}
如果不是这种情况,您可以使您的方法接受泛型类型
public void method1(int a, int b, T object){}
由于所有类都有相同的变量,因此使用这两种方法都不会有任何问题。
答案 1 :(得分:0)
如果您正在尝试了解设计模式,那么您需要一个抽象对象实例化的创建模式。这可以通过工厂模式来实现。
你的第二个要求违背了使用工厂模式的目的,因为调用者(通过工厂请求对象的人)可能仍然需要知道实际的实例类型以便将参数传递给10(已知的方法)< / p>
答案 2 :(得分:0)
不使用接口或扩展其他类确实限制了编译器可以执行哪些操作以确保代码安全。
您可以通过创建10种方法来解决该问题,以使它们接收简单的 Object ,然后使用反射来分配所需的值。
但是,您应该检查传递给方法的无效参数(即:检查该类是否在可接受的类列表中)或至少确保接收到的对象具有适当的成员(设置者)。
答案 3 :(得分:0)
这就是我要做的:
根据一组条件,我将构建一个实现通用接口的包装器:
eval
具有与public interface CommonInterface {
public String getVar1();
public void setVar1(String value);
public String getVar2();
public void setVar2(String value);
// ...
}
,ClassA
和ClassB
中相同的获取器和设置器:
ClassC
然后可以动态创建实现public class ClassA {
private String var1;
private String var2;
public String getVar1() {
return var1;
}
public void setVar1(String value) {
var1 = value;
}
public String getVar2() {
return var2;
}
public void setVar2(String value) {
var2 = value;
}
}
的包装器。您可以使用工厂方法来选择一个对象,具体取决于年份:
CommonInterface
public static CommonInterface getWrapper(ClassA a, ClassB b, ClassC c,
int year) {
if (year >= 2017) {
return wrap(a, CommonInterface.class);
} else if (year >= 2016) {
return wrap(b, CommonInterface.class);
} else {
return wrap(c, CommonInterface.class);
}
}
方法如下:
wrap