toniGitH /
Patron-Prototype
Explicación del patrón Prototype y ejemplo de uso en PHP
Loading repository data…
toniGitH / repository
Explicación del patrón Abstract Factory y ejemplo de uso en PHP
Repositorio creado para explicar el patrón Abstract Factory y su implementación mediante un ejemplo práctico en PHP (Tienda de Muebles).
Abstract Factory es un patrón de diseño creacional que define una fábrica abstracta (interfaz o clase abstracta) que declara diversos métodos fábrica, cada uno de ellos responsable de la creación de un objeto de tipo producto abstracto, todos ellos pertenecientes a una misma familia o variante, delegando en las clases que implementan dicha interfaz, llamadas fábricas concretas la responsabilidad de instanciar los productos concretos, de manera que el cliente pueda trabajar con familias completas de objetos relacionados sin conocer sus clases concretas, garantizando así la coherencia entre los productos de una misma familia.
Mientras que el Factory Method se centra en crear un solo tipo de producto, el Abstract Factory se ocupa de crear múltiples tipos de objetos que pertenecen a una misma familia o variante, garantizando que el cliente reciba objetos compatibles entre sí.
⚠️ No todos los lenguajes permiten el uso de abstract, pero en aquellos que sí lo permitan (PHP, Java, ...), se recomienda su uso, al igual que en patrón Factory Method.
💡 La idea clave: Imagina una fábrica que no solo produce sillas, sino "juegos de muebles". Si pides un juego "Moderno", la fábrica te dará una silla moderna, un sofá moderno y una mesa moderna. No te dará una silla moderna con una mesa victoriana. El patrón asegura esa coherencia.
Este patrón no obliga a crear familias completas, así que podrías pedirle a una fábrica que te dé sólo una silla moderna, o una mesa clásica, pero sabes que si le pides varios objetos a una fábrica concreta, todos ellos serán compatibles o de la misma familia (no podrías pedirle a una fábrica moderna que te dé una silla moderna y una mesa victoriana).
Este patrón es especialmente útil cuando necesitas mantener la coherencia entre los objetos de una misma familia, lo que es especialmente útil en interfaces gráficas, donde los objetos deben ser compatibles entre sí.
📌 FÁBRICA ABSTRACTA (Abstract Factory): Es una interfaz (o clase abstracta) que declara un conjunto de métodos para crear cada uno de los productos de la familia (por ejemplo: fabricarSilla(), fabricarMesa(), fabricarSofa(), etc...). No implementa nada, solo dice: "quien quiera ser una fábrica de este tipo de objetos debe tener ciertos métodos". Al igual que pasa con el patrón Factory Method, la fabrica abstracta puede ser una interfaz o una clase abstracta (dependiendo de las necesidades del proyecto), pero también podría ser una clase concreta.
📌 MÉTODOS FÁBRICA (Factory Methods): Son los métodos declarados en la fábrica abstracta, cada uno responsable de crear un tipo específico de producto de la familia. Por ejemplo: fabricarSilla(), fabricarMesa(), fabricarSofa(). Cada uno de estos métodos es, en esencia, un Factory Method que debe ser implementado por las fábricas concretas. El tipo de retorno de cada método fábrica DEBE coincidir con la interfaz del producto abstracto correspondiente (por ejemplo, fabricarSilla(): SillaInterface).
Y del mismo modo que sucede en el patrón Factory Method, los métodos fábrica de la fábrica abstracta pueden ser abstractos (no implementados) o concretos (implementados), aunque igualmente, es más coherente que sean abstractos.
📌 FÁBRICAS CONCRETAS: Son las implementaciones de la fábrica abstracta. Cada fábrica concreta se especializa en una variante o familia.
Estas clases son las que se van a instanciar en cada caso (no la fábrica abstracta), y por tanto, son las que van a determinar en cada situación, mediante su implementación de los métodos fábrica, el tipo de objeto que se va a crear en cada situación, pero siempre siendo objetos de la misma variante o familia:
FabricaMueblesModernos: fabrica sillas, sofás, lámparas, etc... Modernos.FabricaMueblesClasicos: fabrica sillas, sofás, lámparas, etc... Clásicos.La responsabilidad de las fábricas concretas ES EXCLUSIVAMENTE crear objetos ProductoConcreto. A diferencia del patrón Factory Method (donde las subclases heredan lógica de negocio de la clase base), en el patrón Abstract Factory las fábricas concretas son "puras fábricas": solo crean y devuelven objetos. La lógica de negocio reside en el Cliente, no en las fábricas.
Estas fábricas concretas se instanciarán, como cualquier otra clase, con el new y darán lugar a un objeto de esa fábrica concreta (FabricaMueblesModernos, FabricaMueblesClasicos, etc...). Cada fábrica concreta implementará todos los métodos fábrica declarados en la interfaz, y cada uno de esos métodos simplemente creará y devolverá el ProductoConcreto correspondiente a su familia.
Por ejemplo, una clase FabricaMueblesModernos (que implementa la interface MueblesFactoryInterface):
fabricarSilla(), fabricarMesa(), fabricarSofa(), etc.)fabricarSilla() → devuelve new SillaModerna()fabricarMesa() → devuelve new MesaModerna()fabricarSofa() → devuelve new SofaModerno()📌 PRODUCTOS ABSTRACTOS: Son interfaces (o clases abstractas) que definen el contrato que deben cumplir todos los productos de un mismo tipo, independientemente de la familia a la que pertenezcan.
En el patrón Abstract Factory, necesitamos una interfaz por cada tipo de producto que las fábricas puedan crear. Por ejemplo:
SillaInterface: Define qué métodos debe tener cualquier silla (moderna, clásica, vintage...)MesaInterface: Define qué métodos debe tener cualquier mesaSofaInterface: Define qué métodos debe tener cualquier sofáEstas interfaces son las que aparecen como tipo de retorno de los métodos fábrica. Por ejemplo, el método fabricarSilla() devuelve SillaInterface, no una clase concreta.
Esto es fundamental porque permite que el Cliente trabaje con abstracciones sin conocer las clases concretas. El cliente sabe que recibirá "algo que cumple el contrato de Silla", pero no necesita saber si es moderna, clásica o vintage.
📌 PRODUCTOS CONCRETOS: Son las clases que implementan las interfaces de productos abstractos. Representan las implementaciones específicas de cada producto para cada familia o variante.
Cada producto concreto pertenece a una familia específica y debe implementar la interfaz correspondiente a su tipo de producto:
SillaModerna, MesaModerna, SofaModernoSillaClasica, MesaClasica, SofaClasicoSillaVintage, MesaVintage, SofaVintagePor ejemplo, SillaModerna implementa SillaInterface, y SillaClasica también implementa SillaInterface. Ambas cumplen el mismo contrato, pero cada una lo hace a su manera, con su propio estilo y características.
Estos son los objetos que realmente se crean cuando el cliente llama a los métodos fábrica. Cuando el cliente pide $fabrica->fabricarSilla(), recibe una instancia de SillaModerna, SillaClasica o SillaVintage, dependiendo de qué fábrica concreta esté usando.
📌 CLIENTE: La parte del código que usa la fábrica. El cliente solo conoce las interfaces (Abstract Factory y Abstract Product), por lo que es independiente de las clases concretas que se están usando.
Este cliente NO forma parte del patrón en sí mismo, sino que es el código que se encarga de usar la fábrica para crear los productos.
Supongamos que tenemos un simulador de una Tienda de Muebles. El cliente entra y dice: "Quiero amueblar mi salón con estilo Vintage".
La tienda (Cliente) no necesita saber cómo se fabrica cada mueble vintage. Simplemente recibe una FabricaVintage. Cuando la tienda necesita una silla, le dice a la fábrica: fabricarSilla(). Como la fábrica es la versión "Vintage", devolverá una SillaVintage.
Si mañana el cliente quiere estilo Moderno, pasamos a la tienda una FabricaModerna. La tienda sigue llamando a fabricarSilla(), pero ahora mágicamente recibe una SillaModerna.
La tienda no cambia su código, solo cambia la fábrica que utiliza.
1️⃣ Interfaz Abstract Factory: Define los métodos de creación para los distintos productos (fabricarSilla(), fabricarMesa(), fabricarLampara()).
Fabrica.php.2️⃣ Fábricas Concretas: Implementan la interfaz anterior para una familia específica.
FabricaClasica.php, FabricaModerna.php, FabricaVintage.php.3️⃣ Interfaces de Productos: Definen qué puede hacer cada producto.
Silla.php, Mesa.php, Lampara.php.4️⃣ Productos Concretos: Implementan las interfaces de producto para cada familia.
SillaClasica.php, MesaModerna.php, LamparaVintage.php, etc.SillaClasica implementa Silla).📌 Coherencia entre productos Garantiza que los productos que usas juntos combinan entre sí (pertenecen a la misma
Selected from shared topics, language and repository description—not editorial ratings.
toniGitH /
Explicación del patrón Prototype y ejemplo de uso en PHP
toniGitH /
Explicación del patrón Singleton y ejemplo de uso en PHP
toniGitH /
Explicación del patrón Builder y ejemplo de uso en PHP
toniGitH /
Explicación del patrón Adapter y ejemplo de uso en PHP
toniGitH /
Explicación del patrón Facade y ejemplo de uso en PHP
toniGitH /
Explicación del patrón Decorator y ejemplo de uso en PHP