Что такое класс Factory?

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

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