2010-02-11 10 views
5

Nunca antes había usado Factories por el simple motivo, no entiendo cuando los necesito. He estado trabajando en un pequeño juego en mi tiempo libre, y decidí implementar FMOD para el sonido. Miré a un contenedor diseñado para OpenAL (configuración del sonido diferente) y se veía algo así como ...¿Entender las fábricas y debería usarlas?

SoundObject * * SoundObjectManager SoundObjectFactory *

El SoundObject era básicamente la instancia de cada objeto de sonido. SoundObjectManager solo administra todos estos objetos. Esto es bastante directo y tiene mucho sentido, pero no entiendo lo que la fábrica está haciendo o lo que se usa. He estado leyendo en Factorys pero todavía no los entiendo.

¡Cualquier ayuda sería apreciada!

Respuesta

2

Think of Factory como un "constructor virtual". Le permite construir objetos con un tipo de tiempo de compilación común pero diferentes tipos de tiempo de ejecución. Puede cambiar el comportamiento simplemente diciéndole a la fábrica que cree una instancia de un tipo de tiempo de ejecución diferente.

+0

¿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. –

+0

Si no tiene diferentes subtipos de SoundObject, diría "no". – duffymo

+0

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 –

1

Las fábricas se utilizan cuando la implementación necesita ser parametrizada. FMOD es multiplataforma, necesita decidir qué implementación concreta le dará a su plataforma. Eso es lo que está haciendo la fábrica. Hay dos patrones principales Abstract Factory Pattern y Factory Method Pattern.

1

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.

+0

Eso tiene perfecto sentido, debe buscar en la escritura de C++ para dummies books lol. En lo que respecta a ese enlace, publiqué en el comentario anterior, todavía no estoy seguro de lo que está haciendo, pero parece que está usando la fábrica para convertirlo en un objeto móvil, pero realmente no lo entiendo. Dado que este es solo un proyecto de aprendizaje voy a ir sin uno por ahora, supongo, y sabré cuando necesito usar uno en el futuro. –

+0

Esto no es específico de C++, es un patrón de diseño general para todos los lenguajes OO (y algunos no-OO) –

0

Las fábricas se pueden usar para implementar la inversión de control y para separar el código de instanciación (el 'nuevo') de la lógica de sus componentes. Esto es útil cuando escribe pruebas unitarias, ya que es posible que no desee que los objetos probados creen otros muchos objetos.

Cuestiones relacionadas