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

StackOverflow https://stackoverflow.com/questions/2248547

  •  20-09-2019
  •  | 
  •  

Вопрос

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

SoundObject* SoundObjectManager* SoundObjectFactory*

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

Мы будем признательны за любую помощь!

Это было полезно?

Решение

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

Другие советы

Фабрики используются, когда необходимо параметризовать реализацию.FMOD является кроссплатформенным, ему нужно решить, какую конкретную реализацию предоставить вам для вашей платформы.Это то, чем занимается Фабрика.Есть две основные Закономерности Абстрактный Фабричный Узор и Шаблон Заводского метода.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top