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