Java 如何在构造函数中创建给定类型的新对象
我很难弄清楚如何基于给定类型在构造函数中创建新对象 例如,我有一个机器人驱动程序,它有一个默认构造函数,不接受任何参数,并创建一个基本机器人。但是我有另一个构造器,它根据这个参数创建了一个新的机器人Java 如何在构造函数中创建给定类型的新对象,java,oop,polymorphism,Java,Oop,Polymorphism,我很难弄清楚如何基于给定类型在构造函数中创建新对象 例如,我有一个机器人驱动程序,它有一个默认构造函数,不接受任何参数,并创建一个基本机器人。但是我有另一个构造器,它根据这个参数创建了一个新的机器人 public RobotDriver() { this.robot = new BasicRobot(); } public RobotDriver(Robot robot) { //don't know what to do here... } Robot是一个接口。那么,如果我想创
public RobotDriver() {
this.robot = new BasicRobot();
}
public RobotDriver(Robot robot) {
//don't know what to do here...
}
Robot
是一个接口。那么,如果我想创建RobotDriver
,使它的Robot
是另一种类型,比如AdvancedRobot
,该怎么办?我需要做一些类型的铸造吗 您可能正在寻找一个可以创建任何机器人类型对象的类:RobotDriver/AdvancerRobot等。如果是,那么您需要研究工厂设计模式
工厂方法模式是一种创造性的使用工厂的模式
处理创建对象问题的方法
指定要创建的对象的确切类别。这是
通过调用指定的工厂方法创建对象来完成
在接口中,由子类实现,或在
基类,并可选地由派生类而不是
调用构造函数
可能您正在寻找一个可以创建任何机器人类型对象的类:RobotDriver/AdvancerRobot等。如果是,那么您需要研究工厂设计模式 工厂方法模式是一种创造性的使用工厂的模式 处理创建对象问题的方法 指定要创建的对象的确切类别。这是 通过调用指定的工厂方法创建对象来完成 在接口中,由子类实现,或在 基类,并可选地由派生类而不是 调用构造函数
可能您正在寻找一个可以创建任何机器人类型对象的类:RobotDriver/AdvancerRobot等。如果是,那么您需要研究工厂设计模式 工厂方法模式是一种创造性的使用工厂的模式 处理创建对象问题的方法 指定要创建的对象的确切类别。这是 通过调用指定的工厂方法创建对象来完成 在接口中,由子类实现,或在 基类,并可选地由派生类而不是 调用构造函数
可能您正在寻找一个可以创建任何机器人类型对象的类:RobotDriver/AdvancerRobot等。如果是,那么您需要研究工厂设计模式 工厂方法模式是一种创造性的使用工厂的模式 处理创建对象问题的方法 指定要创建的对象的确切类别。这是 通过调用指定的工厂方法创建对象来完成 在接口中,由子类实现,或在 基类,并可选地由派生类而不是 调用构造函数
为此,您可以扩展Robot类并创建一个名为AdvancedRobot的新类。然后可以使用多态性。理想情况下,您可以在新创建的AdvancedRobot类中创建逻辑来封装AdvancedRobot。如果设置正确,则无需进行铸造。为此,可以扩展Robot类并创建一个名为AdvancedRobot的新类。然后可以使用多态性。理想情况下,您可以在新创建的AdvancedRobot类中创建逻辑来封装AdvancedRobot。如果设置正确,则无需进行铸造。为此,可以扩展Robot类并创建一个名为AdvancedRobot的新类。然后可以使用多态性。理想情况下,您可以在新创建的AdvancedRobot类中创建逻辑来封装AdvancedRobot。如果设置正确,则无需进行铸造。为此,可以扩展Robot类并创建一个名为AdvancedRobot的新类。然后可以使用多态性。理想情况下,您可以在新创建的AdvancedRobot类中创建逻辑来封装AdvancedRobot。如果设置正确,则无需执行强制转换。如果只想捕获构造函数参数,可以使用:
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()
公开(默认情况下受保护
):
(这基本上是另一个版本的makeCopy()
)
最后,应用,您可以定义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;
}
}
如果只想捕获构造函数参数,可以使用:
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()
公开(默认情况下受保护
):
(这基本上是另一个版本的makeCopy()
)
最后,应用,您可以定义RobotDriver
构造函数,将工厂作为参数,或者,对于默认构造函数