Что именно представляет собой Class Factory? - PullRequest
31 голосов
/ 27 марта 2010

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

Что такое фабрика классов? Может кто-нибудь объяснить концепцию?

Ответы [ 5 ]

29 голосов
/ 01 июня 2010

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

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

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

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

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

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

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

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

14 голосов
/ 27 марта 2010

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

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

5 голосов
/ 27 марта 2010

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

2 голосов
/ 27 марта 2010

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

Но, вероятно, наиболее авторитетное определение можно найти в книге Design Patterns Gamma et al. (обычно называется «Банда четырех книг»).

2 голосов
/ 27 марта 2010

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

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

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

Извините, если вы уже прочитали это и обнаружили, что этого недостаточно.

...