2010-06-03 7 views
5

¿por qué necesitamos un patrón de diseño de Abstract Factory para crear objetos? ¿Por qué no podemos simplemente usar el nuevo operador? la respuesta es, para evitar el acoplamiento hermético de los objetos. Pero no entendí cómo? ¿Alguien puede explicar con código (será muy útil).¿Patrón de diseño abstracto de fábrica para crear objetos? ¿Por qué no podemos simplemente usar el nuevo operador?

qué hace que el patrón de diseño de fábrica abstracto sea útil y cuándo.

Gracias de antemano. Harsha T

+4

Hay tantas buenas explicaciones (como el enlace de Enrico a continuación) de esto para encontrarlas en google o en dos. Realmente no veo ningún valor en reproducir ninguna aquí. Si encuentras una explicación que parece poco convincente, quizás una pregunta sobre los detalles de esa explicación sería más interesante. – djna

Respuesta

2

Si utiliza el operador new, debe especificar el tipo exacto que desea. A veces quiere ser más genérico, por ejemplo, porque quiere poder cambiar ese tipo de instancia en toda la base de código rápidamente.

2

Un patrón de diseño factoría abstracta está diseñado para crear un objeto con una configuración específica en tiempo de inicialización. Por ejemplo, si tiene muchas clases conectadas de forma similar, en lugar de repetir las mismas 4+ líneas [y utilizando copiar y pegar], la fábrica abstracta le permitirá mantener las 4 líneas en un solo lugar y reducir la cantidad de cambios necesarios

Reference For Abstract Factory

0

Hay una bastante buena ejemplo de C# en Wikipedia. Mantiene su código de nivel de aplicación de tener que saber qué implementaciones está obteniendo. La fábrica se encarga de eso.

0

Utilizando una fábrica abstracta, puede crear objetos sin conocer el tipo real. Digamos que necesitas un IDictionary. Puedes crear una nueva instancia de una clase de árbol binario que conoces, o podrías decirle a IDictionary-factory que necesitas una nueva instancia. Entonces, alguien más podría crear una implementación de fábrica que devuelva hash-tables, pero todo en su lado seguirá funcionando de la misma manera.

0
  • en primer lugar que no es necesario conocer el tipo de objeto específico de su fábrica está instanciando,
  • entonces se puede conectar sus clases de fábrica alrededor de su proyecto dejarlos crear instancias de objetos para sus componentes sin tener que utilizar new en su código. La fábrica ya hacer su trabajo sucio
  • conceptualmente separa la creación de instancias de objeto a partir de su uso, mantener las cosas desacoplados
1

Aquí está un ejemplo sencillo derivado de una capa de independencia de la versión he construido para nuestro producto:

interface ICadSystemFactory 
{ 
    ICadSystem GetSystemInstance(); 
} 

class 3dCadSystemVersion1 : ICadSystemFactory 
{ 
    ICadSystem GetSystemInstance() 
    { 
     return new 3dCadSystemWrapperVersion1(new 3dCadSystemVersion1()); 
    } 
} 



class 3dCadSystemVersion2 : ICadSystemFactory 
{ 
    ICadSystem GetSystemInstance() 
    { 
     return new 3dCadSystemWrapperVersion2(new 3dCadSystemVersion2()); 
    } 
} 

Donde los objetos 3dCadSystemWrapperVersionX implementan la interfaz ICadSystem. Utilizo un objeto de registro para decidir qué fábrica base quiero crear en base a ciertos identificadores de versión. Esto me permite conectar nuevas versiones según sea necesario sin alterar la infraestructura existente, lo que resulta útil en este caso. De hecho, me permitiría conectar productos completamente nuevos si fuera necesario, lo que en general podría ser útil, pero en mi caso no vale la pena el esfuerzo de implementación.

2

si tiene:

class Foo implements DoSomething {...} 
class Bar implements DoSomething {...} 

obj = new Foo(); 
obj.doSomething(); 

En todas partes de su código, una vez que desea cambiar todas las instancias de Foo para utilizar las instancias de bar, es lo que realmente va a hacer buscar/reemplazar?


Si usted tiene:

obj = DoSomethingFactory.create(); 
obj.doSomething(); 

Dentro de la DoSomethingFactory, puede devolver cualquier objeto que desea que implementa la interfazHacerAlgo.

Al utilizar una fábrica, usted tiene el control sobre todos los objetos que crea.

Si decide cambiar la forma en que la fábrica crea los objetos, los cambios surten efecto inmediatamente en el código que usa la fábrica.

Cuestiones relacionadas