Понимание фабрик и должен ли я их использовать?


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

SoundObject* SoundObjectManager* SoundObjectFactory *

SoundObject был в основном экземпляром каждого звукового объекта. SoundObjectManager просто управляет всем этим объекты. Это достаточно прямолинейно и имеет много смысла, но я не понимаю, что делает фабрика или что она используется. Я читал о фабриках, но все еще не совсем понимаю их.

Любая помощь будет оценена!

4 5

4 ответа:

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

Фабрики

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

Гипотетическая ситуация: я пишу звуковую библиотеку, которую хочу запустить на нескольких платформах. Я постараюсь сделать как можно больше кода независимым от платформы, но, конечно, некоторые из них нужно будет изменить для Windows против OSX против Linux.

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

Поэтому я определяю этот хороший универсальный базовый класс SoundObject, который определяет все методы, используемые клиентом. Затем я делаю свой выбор.LinuxSoundObject, WindowsSoundObject, и 5 других производных от SoundObject. Но я собираюсь скрыть все эти конкретные реализации от пользователя и предоставить им только SoundObject. Вместо этого вам нужно позвонить моему SoundObjectFactory, чтобы схватить то, что кажется вам простым старым SoundObject, но на самом деле я выбрал правильный тип среды выполнения для вас и создал его сам.

2 года спустя появляется новая ОС, которая вытесняет Windows. Вместо того, чтобы заставлять вас переписывать программное обеспечение, я просто обновляю свою библиотеку для поддержки новой платформы, и вы никогда не увидите изменений в интерфейсе.

Все это довольно надуманно, но, надеюсь, вы поняли идею.

Фабрики изолируют потребителей интерфейса от того, какой тип среды выполнения (т. е. реализация) действительно используется.

Фабрики

Могут быть использованы для реализации инверсии управления и для отделения кода экземпляра ('new') от логики ваших компонентов. Это полезно, когда вы пишете модульные тесты, так как вы не хотите, чтобы тестируемые объекты создавали кучу других объектов.