界面:
public interface Person {
public String name = "";
}
我有两个班级:
public class Male implements Person {
public String name = "Male1";
}
另一个班级
public class Female implements Person {
public String name = "Female";
}
我想在运行时根据用户是谁来实例化一个类。类似的东西:
Person p = getPerson("M");
System.out.println("P = " + p.name);
private static Person getPerson(String gender) {
if (gender.equals("M"))
return new Male();
else if (gender.equals("F"))
return new Female();
else
return null;
}
我期待输出为:Male1 我怎样才能做到这一点?实现此功能的最佳设计模式是什么?
答案 0 :(得分:0)
查找并使用Class.forName()
答案 1 :(得分:0)
您不会将属性放在界面中。
您的界面应包含String getName();
方法签名。然后在所有继承的类中实现此方法。这样,无论实现类如何,您都可以在getName()
对象上调用Person
来检索此人的姓名。
要实例化,请查看工厂模式。
答案 2 :(得分:0)
有几种选择,但您可以使用抽象工厂:
仅使用PersonFactory
方法创建createPerson
界面。然后进行两个实现:
MaleFactory
,返回新的Male
FemaleFactory
,返回新的Female
然后保留一个Map<String, PersonFactory>
,其中键是性别,值是工厂的一个实例,它将创建相应的Person
个实例。
获得性别的新Person
变得像
map.get(gender).createPerson()
修改强>:
我看到你编辑了你的问题,现在它包含了一个关于在接口中使用变量的问题。
基本上,您不希望将变量放在接口中,因为这意味着它是静态的(在这种情况下隐含static
关键字,因为接口不能包含非静态变量),并且我想你不希望所有人都有相同的名字。
因此,您必须在界面中声明getName()
方法。如果所有性别的行为都应该相同(我不明白为什么不这样做)那么你可以将name
变量和getName()
方法放在抽象基类中(例如{{1} } {} AbstractPerson
和Male
都延伸。