У меня есть приложение, которое должно производить автомобили и работать с ними. Создание автомобильных объектов - сложный процесс, поэтому мне нужен завод для каждого типа автомобилей. Также я хочу, чтобы пользователи могли предоставлять свои автомобили и фабрики, которые их производят. Эти типы автомобилей и фабрики должны быть подключены к моему приложению как банки (возможно, есть лучший способ, чем банки, но я не вижу этого).Динамический метод запуска объекта при запуске приложения
Я пришел к идее сделать обычный 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 изменчив, потому что я хочу пользователя чтобы зарегистрировать на этой карте, какой тип автомобиля они отвечают, и что такое название фабричного класса. Таким образом, из пользовательского класса это выглядит так:
И вот мой вопрос. Я не знаю, как вызвать register() метод пользовательской фабрики. Является ли это возможным? Есть ли лучшее решение, чем мой подход?
Я думал о создании общей черты для заводов, найти все загруженные классы, реализующие метод признаков и триггеров через отражение. Но это выглядит довольно сложно. Я надеюсь, что здесь можно использовать шаблон дизайна или трюк ООП. Как вы думаете?
Спасибо!
как подсказка, если вы используете измененную карту, нет необходимости объявлять ее как var. '+ =' будет изменять его на месте. –
О, ты прав. Спасибо :) – Soteric