-
Notifications
You must be signed in to change notification settings - Fork 3
Factory Method
Pandas edited this page Jun 16, 2017
·
3 revisions
Фабричный метод — паттерн, порождающий классы.
Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать. Фабричный метод позволяет классу делегировать инстанцирование подклассам.
Используйте паттерн фабричный метод, когда:
- Классу заранее неизвестно, объекты каких классов ему нужно создавать;
- Класс спроектирован так, чтобы объекты, которые он создает, специфицировались подклассами;
- Класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и вы планируете локализовать знание о том, какой класс принимает эти обязанности на себя.
- Product (Document) — продукт: определяет интерфейс объектов, создаваемых фабричным методом;
- ConcreteProduct (MyDocument) — конкретный продукт: реализует интерфейс Product;
- Creator (Application) — создатель: объявляет фабричный метод, возвращающий объект типа Product. Creator может также определять реализацию по умолчанию фабричного метода, который возвращает объект ConcreteProduct; Может вызывать фабричный метод для создания объекта Product.
- ConcreteCreator (MyApplication) — конкретный создатель: замещает фабричный метод, возвращающий объект ConcreteProduct.
Создатель «полагается» на свои подклассы в определении фабричного ме тода, который будет возвращать экземпляр подходящего конкретного продукта.
- две основных разновидности паттерна. Во первых, это случай, когда класс Creator является абстрактным и не содержит реализации объявленного в нем фабричного метода. Вторая возможность: Creator – конкретный класс, в котором по умолчанию есть реализация фабричного метода. Редко, но встречается и абстрактный класс, имеющий реализацию по умолчанию; В первом случае для определения реализации необходимы подклассы, по скольку никакого разумного умолчания не существует. При этом обходится проблема, связанная с необходимостью инстанцировать заранее неизвест ные классы. Во втором случае конкретный класс Creator использует фаб ричный метод, главным образом ради повышения гибкости. Выполняется правило: «Создавай объекты в отдельной операции, чтобы подклассы мог ли подменить способ их создания». Соблюдение этого правила гарантирует, что авторы подклассов смогут при необходимости изменить класс объектов, инстанцируемых их родителем;
- параметризованные фабричные методы.Это еще один вариант паттерна, который позволяет фабричному методу создавать разные виды продуктов. Фабричному методу передается параметр, который идентифицирует вид создаваемого объекта. Все объекты, получающиеся с помощью фабричного метода, разделяют общий интерфейс Product.
- Позволяет сделать код создания объектов более универсальным, не привязываясь к конкретным классам (ConcreteProduct), а оперируя лишь общим интерфейсом (Product);
- Позволяет установить связь между параллельными иерархиями классов.
- Необходимость создавать наследника Creator для каждого нового типа продукта (ConcreteProduct). Впрочем, современные языки программирования поддерживают конструкции, что позволяют реализовать фабричный метод без иерархии классов Creator.