Después de mucho batallar hemos encontrado el arreglo de este enigma que agunos usuarios de este sitio han presentado. Si quieres aportar algo más no dejes de dejar tu conocimiento.
Solución:
La diferencia entre los dos
La principal diferencia entre un “método de fábrica” y una “fábrica abstracta” es que el método de fábrica es un método y una fábrica abstracta es un objeto. Creo que mucha gente confunde estos dos términos y comienza a usarlos indistintamente. Recuerdo que me costó mucho encontrar exactamente cuál era la diferencia cuando los aprendí.
Debido a que el método de fábrica es solo un método, se puede anular en una subclase, de ahí la segunda mitad de su cotización:
… el patrón Factory Method usa la herencia y se basa en una subclase para manejar la instanciación de objeto deseada.
La cita asume que un objeto está llamando su propio método de fábrica aquí. Por lo tanto, lo único que podría cambiar el valor de retorno sería una subclase.
La fábrica abstracta es un objeto que tiene múltiples métodos de fábrica. Mirando la primera mitad de su cotización:
… con el patrón Abstract Factory, una clase delega la responsabilidad de la instanciación de objeto a otro objeto a través de la composición …
Lo que están diciendo es que hay un objeto A, que quiere hacer un objeto Foo. En lugar de crear el objeto Foo en sí mismo (por ejemplo, con un método de fábrica), obtendrá una diferente object (la fábrica abstracta) para crear el objeto Foo.
Ejemplos de código
Para mostrarle la diferencia, aquí hay un método de fábrica en uso:
class A
public void doSomething()
Foo f = makeFoo();
f.whatever();
protected Foo makeFoo()
return new RegularFoo();
class B extends A
protected Foo makeFoo()
//subclass is overriding the factory method
//to return something different
return new SpecialFoo();
Y aquí hay una fábrica abstracta en uso:
class A
private Factory factory;
public A(Factory factory)
this.factory = factory;
public void doSomething()
//The concrete class of "f" depends on the concrete class
//of the factory passed into the constructor. If you provide a
//different factory, you get a different Foo object.
Foo f = factory.makeFoo();
f.whatever();
interface Factory
Foo makeFoo();
Bar makeBar();
Aycufcn makeAmbiguousYetCommonlyUsedFakeClassName();
//need to make concrete factories that implement the "Factory" interface here
Fábrica abstracta crea una clase base con métodos abstractos que definen métodos para los objetos que deben crearse. Cada clase de fábrica que deriva la clase base puede crear su propia implementación de cada tipo de objeto.
Método de fábrica es solo un método simple que se usa para crear objetos en una clase. Por lo general, se agrega en la raíz agregada (el Order
la clase tiene un método llamado CreateOrderLine
)
Fábrica abstracta
En el siguiente ejemplo, diseñamos una interfaz para que podamos desacoplar la creación de colas de un sistema de mensajería y, por lo tanto, podamos crear implementaciones para diferentes sistemas de colas sin tener que cambiar la base del código.
interface IMessageQueueFactory
IMessageQueue CreateOutboundQueue(string name);
IMessageQueue CreateReplyQueue(string name);
public class AzureServiceBusQueueFactory : IMessageQueueFactory
IMessageQueue CreateOutboundQueue(string name)
//init queue
return new AzureMessageQueue(/*....*/);
IMessageQueue CreateReplyQueue(string name)
//init response queue
return new AzureResponseMessageQueue(/*....*/);
public class MsmqFactory : IMessageQueueFactory
IMessageQueue CreateOutboundQueue(string name)
//init queue
return new MsmqMessageQueue(/*....*/);
IMessageQueue CreateReplyQueue(string name)
//init response queue
return new MsmqResponseMessageQueue(/*....*/);
Método de fábrica
El problema en los servidores HTTP es que siempre necesitamos una respuesta para cada solicitud.
public interface IHttpRequest
// .. all other methods ..
IHttpResponse CreateResponse(int httpStatusCode);
Sin el método de fábrica, los usuarios del servidor HTTP (es decir, los programadores) se verían obligados a utilizar clases específicas de implementación que frustran el propósito de la IHttpRequest
interfaz.
Por lo tanto, introducimos el método de fábrica para que la creación de la clase de respuesta también se abstraiga.
Resumen
La diferencia es que el finalidad prevista de la clase que contiene un método de fábrica no es crear objetos, mientras que una fábrica abstracta solo debe usarse para crear objetos.
Se debe tener cuidado al usar métodos de fábrica, ya que es fácil romper el LSP (principio de sustitución de Liskov) al crear objetos.
La diferencia entre los patrones de diseño de AbstractFactory y Factory es la siguiente:
- Método de fábrica se utiliza para crear un solo producto, pero Fábrica abstracta se trata de crear familias de productos relacionados o dependientes.
- Método de fábrica patrón expone un método al cliente para crear el objeto, mientras que en el caso de Fábrica abstracta exponen una familia de objetos relacionados que pueden consistir en estos métodos Factory.
- Método de fábrica patrón oculta la construcción de un solo objeto, mientras que Fábrica abstracta oculta la construcción de una familia de objetos relacionados. Las fábricas abstractas generalmente se implementan utilizando (un conjunto de) métodos de fábrica.
- Fábrica abstracta patrón utiliza la composición para delegar la responsabilidad de crear un objeto a otra clase mientras Método de fábrica El patrón de diseño utiliza la herencia y se basa en una clase o subclase derivada para crear un objeto.
- La idea detrás del Método de fábrica patrón es que permite el caso en el que un cliente no sabe qué clases concretas tendrá que crear en tiempo de ejecución, pero solo quiere obtener una clase que hará el trabajo mientras Fábrica abstracta El patrón se utiliza mejor cuando su sistema tiene que crear varias familias de productos o desea proporcionar una biblioteca de productos sin exponer los detalles de implementación.
Implementación del patrón del método de fábrica:
Implementación de patrones abstractos de fábrica:
Puntuaciones y reseñas
Te invitamos a ayudar nuestro análisis añadiendo un comentario y valorándolo te damos las gracias.