Понимание фабрик и должен ли я их использовать?
Я никогда раньше не пользовался фабриками по той простой причине, что не понимаю, когда они мне нужны. Я работал над небольшой игрой в свободное время, и я решил реализовать FMOD для звука. Я посмотрел на обертку, предназначенную для OpenAL (разные настройки звука), и она выглядела примерно так...
SoundObject* SoundObjectManager* SoundObjectFactory *
SoundObject был в основном экземпляром каждого звукового объекта. SoundObjectManager просто управляет всем этим объекты. Это достаточно прямолинейно и имеет много смысла, но я не понимаю, что делает фабрика или что она используется. Я читал о фабриках, но все еще не совсем понимаю их.
Любая помощь будет оценена!
4 ответа:
Думайте о фабрике как о "виртуальном конструкторе". Он позволяет создавать объекты с общим типом времени компиляции, но различными типами среды выполнения. Вы можете переключить поведение, просто попросив фабрику создать экземпляр другого типа среды выполнения.
Фабрики
Используются, когда реализация нуждается в параметризации. FMOD-это кроссплатформенная платформа, она должна решить, какую конкретную реализацию дать вам для вашей платформы. Вот что делает Фабрика. Существует два основных паттернаабстрактный Фабричный паттерн ифабричный метод паттерн .
Гипотетическая ситуация: я пишу звуковую библиотеку, которую хочу запустить на нескольких платформах. Я постараюсь сделать как можно больше кода независимым от платформы, но, конечно, некоторые из них нужно будет изменить для Windows против OSX против Linux.
Поэтому я пишу все эти различные реализации, но я не хочу, чтобы конечному пользователю приходилось делать свою программу зависимой от Linux или Windows или чего-то еще. Я также не хочу поддерживать 4 различных интерфейса к моему API. (Обратите внимание, что это лишь некоторые из причин, по которым вы можете создать фабрику-есть, конечно, и другие ситуации).Поэтому я определяю этот хороший универсальный базовый класс
2 года спустя появляется новая ОС, которая вытесняет Windows. Вместо того, чтобы заставлять вас переписывать программное обеспечение, я просто обновляю свою библиотеку для поддержки новой платформы, и вы никогда не увидите изменений в интерфейсе.SoundObject
, который определяет все методы, используемые клиентом. Затем я делаю свой выбор.LinuxSoundObject
,WindowsSoundObject
, и 5 других производных отSoundObject
. Но я собираюсь скрыть все эти конкретные реализации от пользователя и предоставить им толькоSoundObject
. Вместо этого вам нужно позвонить моемуSoundObjectFactory
, чтобы схватить то, что кажется вам простым старымSoundObject
, но на самом деле я выбрал правильный тип среды выполнения для вас и создал его сам.Все это довольно надуманно, но, надеюсь, вы поняли идею.
Фабрики изолируют потребителей интерфейса от того, какой тип среды выполнения (т. е. реализация) действительно используется.