Фабричный метод — это порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
Шаблон используется в случаях если:
- класс заранее не знает, какие объекты необходимо будет создавать, т.к. возможны варианты реализации;
- (или) класс спроектирован так, что спецификация порождаемого объекта определяется только в наследниках.
- (или) класс выделяет и делегирует часть своих функций вспомогательному классу. При этом необходимо скрыть его реализацию для достижения большей гибкости или возможности расширения функциональности.
Реализация шаблона в общем виде
- определяется интерфейс порождаемых объектов IProduct;
- базовый класс описывает метод public IProduct FabricMethod() для их создания;
- наследники переопределяют его, порождая свои реализации IProduct;
- базовый класс и клиентский код используют в работе только интерфейс IProduct, не обращаясь к конкретным реализациям самостоятельно.
Пример реализации
Для начала создадим интерфейс IProduction с единственным методом Release();
Данный интерфейс представляет абстрактное представлением выпуска нового продукта. После создадим конкретный класс Product который реализует интерфейс IProduction.
А так класс AnotherProduct который так же реализует интерфейс IProduction.
После создадим интерфейс IFactory, который представляет собой фабрику, производящую Products, в котором реализован единственный метод Create();
Данный интерфейс будет реализован в конкретном классе ProductFactory и AnotherFactory, в них метод Create будет возвращать экземпляр класса Product и соответственно AnotherProduct.
Посмотрим применение данного паттерна
Создаем экземпляр фабрики по производству Product. Результат метода Create создаст Product. Далее переквалифицируем фабрику на производство AnotherProduct. Теперь результат метода Create создаст AnotherProduct. В итоге на созданных продуктах вызываем метод Release.
Результат выполнения