如何在构造函数中创建给定类型的新对象

时间:2014-10-05 02:10:37

标签: java oop polymorphism

我无法弄清楚如何根据给定的类型在构造函数中创建新对象。

例如,我有一个机器人驱动程序,它有一个默认的构造函数,它不带参数并创建一个基本的机器人。但是我有另一个构造函数,它根据参数创建一个新的机器人。

public RobotDriver() {
   this.robot = new BasicRobot();
}

public RobotDriver(Robot robot) {
  //don't know what to do here...
}

Robot是一个界面。那么,如果我想创建RobotDriver以使其Robot属于AdvancedRobot之类的其他类型,该怎么办?我需要做某种类型的铸造吗?

3 个答案:

答案 0 :(得分:2)

可能你正在寻找一个可以创建任何机器人类型对象的类:RobotDriver / AdvanceRobot等。如果是,那么你需要研究工厂设计模式。

Factory Pattern from Wikipedia

  

工厂方法模式是使用工厂的创建模式   处理没有创建对象的问题的方法   指定将要创建的对象的确切类。这是   通过调用工厂方法创建对象来完成 - 指定   在一个接口中,由子类实现,或在一个   基类,并可选择由派生类重写,而不是由   调用构造函数。

答案 1 :(得分:1)

如果您只想捕获构造函数参数,可以使用:

public RobotDriver(Robot robot) {
    this.robot = robot;
}

如果要在构造函数中创建参数的副本,有几种可能性。如果您的Robot实现都具有默认构造函数,则可以执行以下操作:

public RobotDriver(Robot robot) {
    this.robot = robot.getClass().newInstance();
}

如果失败,您可以修改Robot界面以包含复制功能:

public RobotDriver(Robot robot) {
    this.robot = robot.makeCopy();
}

或者您可以将Robot作为Cloneable课程并修改Robot界面以使clone()公开(默认情况下为protected) :

public RobotDriver(Robot robot) {
    this.robot = robot.clone();
}

(这基本上是makeCopy()的另一个版本。)

最后,应用Juned Ahsan's answer,您可以定义RobotDriver构造函数以将工厂作为参数,或者对于默认构造函数,可以使用可设置的静态默认工厂:

public class RobotDriver {
    // basic robots by default
    private static RobotFactory defaultFactory = new BasicRobotFactory();
    private static RobotFactory factory = defaultFactory;

    public RobotDriver() {
        robot = factory.makeRobot();
    }

    /**
     * Change the factory for new instances of RobotDriver
     */
    public static void setFactory(RobotFactory factory) {
        this.factory = factory == null ? defaultFactory : factory;
    }
}

答案 2 :(得分:0)

为此,您可以扩展Robot类并创建一个名为AdvancedRobot的新类。然后,您可以使用多态http://www.tutorialspoint.com/java/java_polymorphism.htm。然后,您将理想地在新创建的AdvancedRobot类中创建逻辑以封装AdvancedRobot。如果你正确设置它,你将不需要进行投射。