在运行时确定要调用的类

时间:2014-03-17 23:15:42

标签: java design-patterns

界面:

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 我怎样才能做到这一点?实现此功能的最佳设计模式是什么?

3 个答案:

答案 0 :(得分:0)

查找并使用Class.forName()

答案 1 :(得分:0)

您不会将属性放在界面中。

您的界面应包含String getName();方法签名。然后在所有继承的类中实现此方法。这样,无论实现类如何,您都可以在getName()对象上调用Person来检索此人的姓名。

要实例化,请查看工厂模式。

答案 2 :(得分:0)

有几种选择,但您可以使用抽象工厂

仅使用PersonFactory方法创建createPerson界面。然后进行两个实现:

  1. MaleFactory,返回新的Male
  2. FemaleFactory,返回新的Female
  3. 然后保留一个Map<String, PersonFactory>,其中键是性别,值是工厂的一个实例,它将创建相应的Person个实例。

    获得性别的新Person变得像

    一样简单
    map.get(gender).createPerson()
    

    修改

    我看到你编辑了你的问题,现在它包含了一个关于在接口中使用变量的问题。

    基本上,您不希望将变量放在接口中,因为这意味着它是静态的(在这种情况下隐含static关键字,因为接口不能包含非静态变量),并且我想你不希望所有人都有相同的名字。

    因此,您必须在界面中声明getName()方法。如果所有性别的行为都应该相同(我不明白为什么不这样做)那么你可以将name变量和getName()方法放在抽象基类中(例如{{1} } {} AbstractPersonMale都延伸。