2014-10-05 61 views
0

我無法弄清楚如何在基於給定類型的構造函數中創建新對象。例如,我有一個機器人驅動程序,它有一個默認的構造函數,它不帶任何參數並創建一個基本的機器人。但是我有另外一個構造函數來創建一個基於參數的新機器人。如何在構造函數中創建給定類型的新對象

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

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

Robot是一個接口。那麼,如果我想創建RobotDriver,使其RobotAdvancedRobot類型不同?我需要做某種類型的演員嗎?

+0

你不想使用'this.robot = robot;'? – 2014-10-05 02:14:25

+0

@TedHopp我在想那個。但是如果我想創建一個新的呢? – mrQWERTY 2014-10-05 02:15:17

+0

你的問題是什麼? 「this.robot = robot」是簡單而好的答案,我想。 – 2014-10-05 02:17:26

回答

2

也許你正在尋找一個能夠創建任何機器人類型的對象的類:RobotDriver/AdvanceRobot等。如果是的話,那麼你需要看看工廠設計模式。

Factory Pattern from Wikipedia

工廠方法模式是利用工廠 方法來處理創建對象的問題,而無需 指定確切類對象的將要創建創建模式。通過調用工廠方法創建對象(在界面中指定 並通過子類實現,或者在 基類中實現並且可以由派生類重寫)而不是由調用構造函數的 來完成,這是通過創建對象來實現的 。

+0

只是注意到我在重複你對不起。我認爲工廠是一個非常好的主意。 – pamps 2014-10-05 02:26:53

0

要做到這一點,您可以擴展Robot類並創建一個名爲AdvancedRobot的新類。然後你可以使用多態性http://www.tutorialspoint.com/java/java_polymorphism.htm。然後,您最好在新創建的AdvancedRobot類中創建邏輯來封裝AdvancedRobot。如果你正確設置了這個,你將不需要做鑄造。

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; 
    } 
} 
相關問題