Что такое точно Фабрика классов?

Я вижу слово, брошенное вокруг часто, и я, возможно, использовал его сам в коде и библиотеках со временем, но я никогда действительно получил его. В большинстве рецензий я столкнулся, они просто продолжили ожидать, что Вы поймете это.

Что такое Фабрика классов? Кто-то может объяснить понятие?

31
задан martineau 14 August 2014 в 11:06
поделиться

5 ответов

Фабрика классов создает экземпляры других классов. Обычно создаваемые ими классы имеют общий базовый класс или интерфейс, но производные классы могут быть возвращены.

Например, у вас может быть фабрика классов, которая принимает строку подключения к базе данных и возвращает класс, реализующий IDbConnection, например SqlConnection (класс и интерфейс из .Net)

.
14
ответ дан 27 November 2019 в 22:20
поделиться

Фабрика классов - это метод, который (в соответствии с некоторыми параметрами, например) возвращает вам настроенный класс (не экземпляр!).

5
ответ дан 27 November 2019 в 22:20
поделиться

Я чувствовал, что это довольно хорошо объясняет (по крайней мере, для меня). Я думаю, фабрики классов используются в шаблоне проектирования фабрики.

Как и другие шаблоны создания, он [шаблон проектирования фабрики] решает проблему создания объектов (продуктов) без указания точного класса объекта, который будет создано. Шаблон дизайна фабричного метода решает эту проблему, определяя отдельный метод для создания объектов, которые подклассы могут затем переопределить, чтобы указать {{1} } производный тип продукта, который будет создан. В более общем смысле термин фабричный метод часто используется для обозначения любого метода, основной целью которого является создание объектов.

http://en.wikipedia.org/wiki/Factory_method_pattern

Приношу извинения, если вы уже прочитали это и сочли его недостаточным.

2
ответ дан 27 November 2019 в 22:20
поделиться

Статья в Википедии дает довольно хорошее определение: http://en.wikipedia.org/wiki/Factory_pattern

Но, вероятно, самое авторитетное определение можно найти в книге Design Patterns Гамма и др. (обычно называемой "Книга банды четырех").

2
ответ дан 27 November 2019 в 22:20
поделиться

Вот некоторая дополнительная информация, которая может помочь лучше понять несколько других, более коротких, хотя технически правильных ответов.

В самом строгом смысле фабрика классов - это функция или метод, которые создают или выбирают класс и возвращают его на основе некоторого условия, определенного из входных параметров или глобального контекста. Это требуется, когда тип необходимого объекта не может быть определен до времени выполнения. Реализация может быть выполнена напрямую, когда классы сами являются объектами используемого языка, такого как Python.

Поскольку основное использование любого класса заключается в создании экземпляров самого себя, на таких языках, как C ++, где классы не являются объектами, которые можно передавать и которыми можно манипулировать, аналогичный результат часто может быть достигнут путем моделирования «виртуальных конструкторов», где вы вызываете конструктор базового класса, но получаете обратно экземпляр некоторого производного класса. Это должно быть смоделировано, потому что конструкторы не могут быть виртуальными в C ++, поэтому такие объекты - не классы - фабрики обычно реализуются как автономные функции или статические методы. .

Хотя использование объектных фабрик является простой и понятной схемой, они требуют ручного ведения списка всех поддерживаемых типов в функции базового класса ' make_object () , что может быть ошибочным - лежачий и трудоемкий (если не упускать из виду).Это также нарушает инкапсуляцию ✶✶ , поскольку член базового класса должен знать обо всех конкретных классах-потомках базы (сейчас и в будущем).

Виртуальные функции обычно разрешаются « поздно » по фактическому типу объекта, на который имеется ссылка, но в случае конструкторов объект еще не существует, поэтому тип необходимо определить другими способами.
✶✶ Инкапсуляция - это свойство дизайна набора классов и функций, в котором скрыты сведения о деталях реализации конкретного класса или функции - и является одним из отличительных признаков объектно-ориентированное программирование.

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

Книга Джеймса Коплиена 1991 г. Advanced C ++: Programming Styles and Idioms содержит подробности об одном способе реализации таких виртуальных универсальных конструкторов в C ++. Есть даже лучшие способы сделать это, используя шаблоны C ++ , но они не рассматриваются в книге, предшествующей их добавлению к стандартному определению языка. Фактически, шаблоны C ++ сами по себе являются фабриками классов, поскольку они создают экземпляр нового класса всякий раз, когда они вызываются с различными аргументами фактического типа. Обновление: Я нашел статью 1998 года, которую Коплиен написал для EuroPLoP под названием C ++ Idioms , где, среди прочего, он пересматривает и перегруппировывает идиомы в своей книге в форму шаблона дизайна а-ля 1994 Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения для многократного использования. Книга . Обратите особое внимание на раздел Virtual Constructor (который использует его структуру шаблона Envelope / Letter ).

Также см. Соответствующие ответы здесь на вопрос Фабрика классов в Python , а также статью доктора Добба 2001 г. о реализации их с помощью шаблонов C ++ под названием Абстрактная фабрика, стиль шаблона .

30
ответ дан 27 November 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: