Один из способов правильно внедрить Dependency Injection - это отделить создание объекта от бизнес-логики. Как правило, это включает использование Фабрики для создания объекта.
До этого момента я никогда серьезно не задумывался об использовании Фабрики, поэтому прошу прощения, если этот вопрос кажется немного упрощенным:
Во всех примерах Factory Pattern, с которыми я столкнулся, я всегда вижу очень простые примеры, которые не имеют параметризации. Например, вот Фабрика, украденная у Миско Хевери отлично Как думать о «новом» операторе статья.
class ApplicationBuilder {
House build() {
return new House(new Kitchen(
new Sink(),
new Dishwasher(),
new Refrigerator())
);
}
}
Однако что произойдет, если я хочу, чтобы у каждого дома, который я строю, было имя? Я все еще использую шаблон Factory, если переписываю этот код следующим образом?
class ApplicationBuilder {
House build( const std::string & house_name) {
return new House( house_name,
new Kitchen(new Sink(),
new Dishwasher(),
new Refrigerator())
);
}
}
Обратите внимание, что мой вызов метода Factory изменился с этого:
ApplicationBuilder builder;
House * my_house = builder.build();
К этому:
ApplicationBuilder builder;
House * my_house = builder.build("Michaels-Treehouse");
Кстати: я думаю, что концепция отделения экземпляров объекта от бизнес-логики великолепна, я просто пытаюсь понять, как я могу применить ее в своей собственной ситуации. Меня смущает то, что все примеры, которые я видел в шаблоне Factory, никогда не передают никаких параметров в функцию build ().
Чтобы быть ясным: я не знаю название дома до того момента, как мне нужно создать его экземпляр.