Вот небольшая дополнительная информация, которая может помочь лучше понять некоторые другие технически правильные, но более короткие ответы.
В самом строгом смысле, Фабрика Классов - это функция или метод, который создает или выбирает класс и возвращает его на основе некоторого условия, определенного из входных параметров или глобального контекста. Это требуется, когда требуемый тип объекта не может быть определен до времени выполнения. Реализация может быть осуществлена непосредственно, когда классы сами являются объектами на используемом языке, таком как Python.
Поскольку основное использование любого класса заключается в создании его экземпляров, в таких языках, как C ++, где классы не являются объектами, которые можно передавать и манипулировать ими, аналогичный результат часто может быть достигнут путем симуляции «виртуальных конструкторов», где Вы вызываете конструктор базового класса, но возвращаете экземпляр некоторого производного класса. Это должно быть смоделировано, потому что конструкторы не могут быть виртуальными ✶ в C ++, поэтому такой объект - не класс - фабрики обычно реализуются как отдельные функции или статические методы.
Хотя использование объектных фабрик является простой и понятной схемой, для них требуется ручное ведение списка всех поддерживаемых типов в функции make_object()
базового класса, которая может быть подвержена ошибкам и трудоемка ( если не переоценить). Это также нарушает инкапсуляцию ✶✶ , так как член базового класса должен знать обо всех конкретных классах-потомках базы (сейчас и в будущем).
✶ Виртуальные функции обычно разрешаются " позднее " фактическим типом объекта, на который ссылаются, но в случае конструкторов объект еще не существует, поэтому тип должен быть определен другими способами.
✶✶ Инкапсуляция - это свойство проекта набора классов и функций, в котором скрыты знания о деталях реализации определенного класса или функции, и является одним из признаков объектно-ориентированного программирования.
Следовательно, лучшими / идеальными реализациями являются те, которые могут обрабатывать новые классы-кандидаты автоматически, когда они добавляются, вместо того, чтобы иметь только определенный конечный набор, в настоящее время жестко закодированный в фабрику (хотя компромисс часто считается приемлемым, поскольку фабрика является место, требующее модификации).
Книга Джеймса Коплина 1991 года Advanced C ++: стили и идиомы программирования содержит подробности об одном способе реализации таких виртуальных универсальных конструкторов в C ++. Есть даже лучшие способы сделать это, используя C ++ шаблоны , но это не было рассмотрено в книге, которая предшествовала их добавлению в определение стандартного языка. Фактически, сами шаблоны C ++ являются фабриками классов, поскольку они создают новый класс всякий раз, когда они используются с различными фактическими аргументами типа.
Обновление: Я нашел статью 1998 года, которую он написал для EuroPLoP под названием C ++ Idioms , где, среди прочего, он пересматривает и группирует идиомы в своей книге в виде шаблона дизайна, как 1994 Шаблоны проектирования: элементы многократно используемого объектно-ориентированного программного обеспечения книга. Обратите особое внимание на раздел Virtual Constructor (в котором используется его структура шаблона Envelope / Letter ).
См. Также соответствующие ответы здесь на вопрос Фабрика классов в Python . Также см. Абстрактная фабрика, стиль шаблона , который является статьей 2001 года доктора Добба и о реализации их с помощью шаблонов C ++.