Фабричный метод
Factory method
Last updated
Was this helpful?
Factory method
Last updated
Was this helpful?
При использовании полиморфизма появляется возможность подмены объекта одного класса на объект другого класса с использованием ссылки (указателя) на базовый абстрактный класс. При создании объекта конкретного класса может возникнуть необходимость подмены одной сущности на другую, в результате чего придется искать, где создается объект, и менять написанный код. В попытках решить эту проблему, сформировалась идея передачи ответственности создания конкретного объекта другому классу.
Фабричный метод (Factory method) - порождающий паттерн проектирования, определяющий единый интерфейс создания объектов и позволяющий менять класс создаваемого объекта.
Подмена создания объекта одного класса на объект другого класса
Появляется возможность создавать объекты, являющиеся наследниками одного базового класса, без привязки к конкретным классам. Это позволяет легко расширять, модифицировать программу, добавляя новые классы, без изменения клиентского кода, который создает объекты классов.
Отделение принятия решения, какой объект нужно создать, от самого процесса создания объекта
После принятия решения о выборе конкретного типа создаваемого объекта создается объект (Creator) конкретного фабричного метода. Фактическое создание объекта происходит при непосредственном вызове метода createProduct() фабричного метода (Creator).
Повторное использование объектов
Появляется возможность повторного использования уже созданного объекта в разных местах программы.
Product - интерфейс объектов, которые создаются подклассами Creator
Creator - абстрактный класс, который предоставляет интерфейс для создания объектов подклассов конкретного продукта (Product)
Solution - абстрактный класс, который предоставляет интерфейс для подклассов, принимающих решения, объект какого подкласса продуктов (Product) надо создавать и возвращающий объект подкласса конкретного Creator
Избавление методов от создания объектов конкретных классов, что решает проблему подмены объекта одного класса на объект другого класса.
Упрощение добавления новых классов без изменения написанного кода.
Возможность разделения принятия решения о создании объекта и собственно создание объекта в разных местах программы.
Возможность принимать решение, объект какого класса необходимо создавать, не во время компиляции, а во время выполнения программы.
Возможность во время выполнения программы подменять создание объекта одного класса на объект другого класса.
Увеличивается объем кода.
Увеличивается время компиляции.
Увеличивается время выполнения программы из-за использования полиморфизма.
Увеличивается количество требуемой памяти.
Требуется создание параллельных иерархий классов.
Необходимость перекомпилировать один и тот же код при добавлении новых типов объектов.
Необходимость в передаче ссылки (указателя) на абстрактный создатель (Creator) в методы клиентского кода, где необходимо создавать объекты.
Фабричный метод может быть использован внутри Абстрактной фабрики для создания конкретных объектов. Вместо того, чтобы создавать объекты напрямую, абстрактная фабрика может использовать фабричный метод для создания экземпляров объектов определенного типа.