我有一個應該生產汽車並與他們一起操作的應用程序。汽車對象的創建是一個複雜的過程,所以我需要爲每種類型的汽車提供一個工廠。另外我希望用戶能夠提供他們自己的汽車和生產它們的工廠。這些汽車類型和工廠應該插入我的應用程序作爲罐子(可能有更好的方式比罐子,但我沒有看到它)。應用程序啓動時動態觸發對象方法
我已經想出了一個製作一個接受汽車名稱(「mercedes」,「bmw」,「nissan」等)作爲參數的通用CarFactory的概念。 CarFactory有一個映射,其中每個名稱映射到它自己的工廠類。該代碼看起來是這樣的(抱歉,我不能提供一個工作拷貝,因爲我仍在評估,並沒有哪個編譯沒有錯誤的版本)
import scala.collection.mutable.Map
class CarFactory {
var knownCarTypes = Map[String, Class[Factory]]()
def create(carType: String) = knownCarTypes.get(carType) match {
case Some(factoryClass) => Some(factoryClass.getMethod("create").invoke(null).asInstanceOf[Car])
case None => None
}
}
}
的knownCarTypes是可變的,因爲我想用戶工廠在該地圖上註冊,提供他們負責的汽車類型以及工廠類別的名稱。因此,從用戶類看起來像這樣
class Mercedes extends Car
object MercedesFactory extends Factory {
def register() {
CarFactory.knownCarTypes("mercedes") = getClass
}
def create() = new Mercedes()
}
這是我的問題。我不知道如何觸發用戶工廠的註冊()方法。可能嗎?有沒有比我的方法更好的解決方案?
我想過爲工廠制定共同的特質,找到所有通過反射實現特質和觸發方法的加載類。但看起來相當複雜。我希望可以在這裏使用一些設計模式或OOP技巧。你怎麼看?
謝謝!
作爲提示,如果您使用可變映射,則不需要將其聲明爲var。 '+ ='會在原地進行修改。 – 2012-03-18 14:44:15
哦..你說得對。謝謝:) – Soteric 2012-03-18 14:56:16