Situación hipotética: Estoy escribiendo una biblioteca de sonidos que quiero ejecutar en múltiples plataformas. Trataré de hacer que la mayor cantidad de código posible sea independiente de la plataforma, pero sin duda alguna tendrá que cambiar para Windows en comparación con OSX versus Linux.
así que escribir todas estas diferentes implementaciones, pero no desea que el usuario final tenga que hacer su programa dependen de Linux o Windows o lo que sea. Tampoco quiero mantener 4 interfaces diferentes a mi API. (Tenga en cuenta que estas son solo algunas de las razones por las que podría crear una fábrica; sin duda, existen otras situaciones).
Defino esta buena clase genérica SoundObject
que define todos los métodos que el cliente puede usar. Luego hago que mi LinuxSoundObject
, WindowsSoundObject
y 5 más se derivan de SoundObject
. Pero voy a ocultar todas estas implementaciones concretas del usuario y solo les proporcionaré un SoundObject
. En su lugar, debe llamar a mi SoundObjectFactory
para obtener lo que parece ser un viejo y simple SoundObject
, pero realmente he elegido el tipo de tiempo de ejecución correcto para usted y lo he creado yo mismo.
2 años después, surge un nuevo sistema operativo que desplaza a Windows. En lugar de forzarlo a reescribir su software, solo actualizo mi biblioteca para admitir la nueva plataforma y nunca verá un cambio en la interfaz.
Todo esto es bastante artificial, pero ojalá se haga una idea.
Las fábricas aíslan a los consumidores de una interfaz del tipo de tiempo de ejecución (es decir, la implementación) que realmente se está utilizando.
¿Entonces para algo como esto realmente no es necesario? Teniendo en cuenta que siempre usaré instancias de SoundObject * y solo una única conexión del administrador. –
Si no tiene diferentes subtipos de SoundObject, diría "no". – duffymo
No realmente, la intención de emplear el patrón es aislar la creación de objetos de su uso. Esto permite introducir nuevos tipos derivados sin cambiar el código que usa la clase base. Es probable que tenga subtipos de SoundObject, pero simplemente no lo sabe, la fábrica lo aísla de los detalles de implementación –