Каковы практические применения Factory Method Pattern?
Я довольно новичок в Design Pattern. Я только что наткнулся на Factory Design Pattern. Я понял, что это делегирует создание экземпляров подклассам. Но я не понял фактического применения шаблона. В каких сценариях этот шаблон может быть использован для хорошего эффекта. Я слышал о злоупотреблении шаблоном и не хотел бы этим заниматься. Кто-нибудь может привести пример из реальной жизни, где он обычно используется.
6 ответов
Я использовал его для плагинов к приложениям... таким образом, вы можете заставить ваше основное приложение вызывать фабрику классов для создания экземпляра конкретного плагина, реализующего некоторый интерфейс, который вы разработали в своем основном приложении. Таким образом, вы можете кодировать основную часть вашего приложения, даже не зная, что будет подключено.
А именно в одном из 2 случаев:
- ваш класс не знает тип объекта, который он хочет создать, но ему просто нужен объект, который будет "выполнять работу". EMF приходит на ум, поскольку он интенсивно использует этот паттерн.
- Вы хотите, чтобы подклассы вашего класса определяли тип используемого объекта. т.е. вы пишете свой родительский класс, не зная, какой конкретный продукт будет создан, это будет обязанностью конкретного создателя.
Предположим, у вас есть очередь, которая содержит объекты типа task
,
Теперь вы можете подкласс task
по разным причинам. Если вы загружаете свои задачи из какого-либо источника, например из базы данных, вы можете использовать фабрику, чтобы определить, какой тип задачи загружать.
Например:
private IEnumerable<Task> GetTasks(DataTable Table){
Task NewTask;
foreach(DataRow Row in Table){
switch(tasktype){
case tasktypes.TaskTypeA:
NewTask = NewTaskA(...);
break;
case TaskTypes.TaskTypeB:
NewTask = NewTaskB(...);
break;
...
}
yield return NewTask;
}
}
Позже вы можете вызывать виртуальные методы для задач в вашей очереди, например, "потреблять" или "обрабатывать".
Преимущество фабричного подхода (в данном случае) состоит в том, что вам нужно включить тип задачи только один раз (при создании задачи) и позволить полиморфизму обрабатывать большинство всего остального.
Я просто использовал его в приложении планирования, где запланированные задачи находятся в отдельных сборках, а планировщик ничего не знает о задачах... Он получает имя сборки, в которой определена задача, из внешнего источника, а затем динамически загружает сборку, создает экземпляр класса в этой сборке с использованием четко определенного интерфейса. Метод фабрики в планировщике, который принимает имя сборки в качестве входного параметра, возвращает экземпляр класса в загруженной сборке...
... но есть так много вариантов использования и способов... этот шаблон.
По общему признанию, необходимость в фактическом использовании более болезненных деталей реализации, описанных шаблоном, была устранена благодаря тому, как работает C#, но моя функциональность SQL DAL передает фабрики объектов (и команды SQL) в служебные функции, которые используют фабрики для генерации объекты. Если бы я не использовал C#, я мог бы вместо этого использовать явный фабричный класс, который генерировал объекты.
Заводской шаблон очень полезен для отображения емкости в соответствующий обработчик.