У меня есть приложение, которое должно производить автомобили и работать с ними. Создание объекта автомобиля - сложный процесс, поэтому мне нужен завод для каждого типа автомобиля. Также я хочу, чтобы пользователи могли предоставлять свои собственные автомобили и заводы, которые их производят. Эти типы автомобилей и заводы должны быть подключены к моему приложению в качестве банок (вероятно, есть лучший способ, чем баночки, но я его не вижу).
Я пришел к мысли создать общий CarFactory, который принимает в качестве аргумента название автомобиля ("mercedes", "bmw", "nissan" и т. Д.). У 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()
}
А вот и мой вопрос. Я не знаю, как вызвать метод register () фабрики пользователей. Является ли это возможным? Есть ли лучшее решение, чем мой подход?
Я думал о том, чтобы создать общую черту для фабрик, найти все загруженные классы, реализующие метод черты и триггера, с помощью отражения. Но это выглядит довольно сложно. Я надеюсь, что здесь можно использовать шаблон дизайна или трюк ООП. Что ты думаешь?
Спасибо!