Страницы

Поиск по вопросам

пятница, 29 ноября 2019 г.

Фабричный метод и абстрактная фабрика

#шаблоны_проектирования


Помогите разобраться.

Чем отличаются данные шаблоны? Когда лучше применять первый, а когда второй? 
    


Ответы

Ответ 1



Фабричный метод: есть некий класс, который выполняет свою специфическую функцию. Часть своей функциональности он делегирует внешнему интерфейсу, который инстанцируется через виртуальный метод этого класса. Наследники этого класса, перекрыв этот метод, могут вернуть другие реализации интерфейса, используемого основным алгоритмом класса. Абстрактная фабрика: класс / интерфейс, не содержащий собственной логики. Все его методы возвращают экземпляры других интерфейсов и вызываются внешними компонентами. Этот паттерн позволяет, подменив реализацию одного интерфейса, подменить набор реализаций ограниченного множества интерфейсов. Абстрактная фабрика применяется, когда требуется создать семейство интерфейсов, реализация которых должна подменяться совместно. Например, при доступе к данным есть стандартный интерфейс, отвечающий за подключение, - IDbConnection, и мой интерфейс, ответственный за преобразование объектной модели запроса в текст запроса, соответствующий стандарту определённой СУБД. Оба этих интерфейса инстанцируются одной фабрикой. В то же время, интерфейс IDbConnection объявляет метод CreateCommand, который возвращает реализацию IDbCommand для соответствующего типа подключения. Это - фабричный метод.

Ответ 2



Лучше показать на примере. class PizzaFactory { def get(): Pizza = new Pizza() } Этот код, является самой простой реализацией фабричного метода. Т.е. есть какой то класс, в котором есть метод, создающий объекты определенного типа. В нашем случае мы создаем пиццу. Теперь расмотрим ситуацию, когда пицца имеет множество видов, и мы хотим получать в разных случаях разные виды. Разные виды пицц наследуются от общего интерфейса Pizza. trait Pizza class ItalianPizza extends Pizza class HawaiiPizza extends Pizza Сделаем для каждого вида, свой фабричный метод, с общим интерфейсом: trait PizzaFactory { abstract def get(): Pizza } class HawaiiFactory extends PizzaFactory { override def get(): Pizza = new HawaiiPizza } class ItalianFactory extends PizzaFactory { override def get(): Pizza = new ItalianPizza } Данная конструкция реализует паттерн - абстрактная фабрика. Как мы видим, фабричный метод является ее частью.

Ответ 3



Вопрос уже не раз поднимался. На первый взгляд кажется, что это вообще одно и то же. На самом деле, это и правда почти то же самое, но лишь с небольшими отличиями. Небольшая разница в том, что фабрика - это как бы много фабричных методов :) Т.е. способ создания объектов группы или иерархии каких-то классов. Прочтите, например, здесь

Комментариев нет:

Отправить комментарий