Предположим, что у меня есть абстрактный класс Drink и фабричный метод, который выбирает тип напитка (Wine, Beer и т. Д.) Для создания во время выполнения.Передача аргументов определенному подклассу с помощью заводского метода
Каждый напиток нуждается в некоторых аргументах, чтобы правильно инициализировать себя. Некоторые из них являются общими для всех напитков; например, они могут потребовать аргумент DrinkConfig.
Но каждый напиток может иметь свои собственные уникальные требования. Возможно, Wine нуждается в вспомогательном объекте Sommelier для инициализации. Пиво это не нужно, но может потребоваться его собственные вспомогательные объекты.
Итак, что мне передать на заводский метод? Когда я это называю, у меня есть все вспомогательные объекты, поэтому я могу просто передать их всем на фабрику. Но это может привести к множеству аргументов. Есть ли лучший способ разработать это?
EDIT: Предположим, что я не могу просто создать вспомогательные объекты на заводе; они доступны только от вызывающего.
Подписи в порядке. Проблема в том, как вы передаете аргументы в свой Factory :: CreateDrink() (или что-то, что оно называется). – dirkgently
Если вы хотите иметь метод CreateDrink на заводе, вы можете использовать параметр перечисления, чтобы указать, какой тип напитка вам нужен. Я не считаю, что этот подход или подход выше соответствуют шаблону фабрики GoF, где объекты создаются в классе Drink (мне нужно проверить мою книгу сегодня), но я нахожу ее более прагматичной и она по-прежнему сохраняет основную выгоду централизации создания объектов для иерархических подклассов. – sipwiz
После проверки моей книги шаблонов дизайна GoF я рад, что приведенный выше пример - это то, насколько близко вы используете Factory как часть шаблона дизайна абстрактной фабрики. Чтобы полностью соответствовать, должен существовать абстрактный заводский класс, который наследует DrinkFactory, но для простых случаев, подобных этому, я обычно оставляю его. Было бы достаточно легко реорганизовать DrinkFactory, если потребуется другая конкретная фабрика. – sipwiz