Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Patrones de Diseño
2022
1. BUILDER
● Director: este actor construye el objeto complejo con la interfaz del constructor. Es
consciente de los requisitos de secuencia del constructor. Con el director, se
desvincula la construcción del objeto del cliente.
● Builder: ofrece una interfaz para crear los componentes de un objeto (o producto)
complejo.
● Specific builder: crea las partes del objeto complejo, define (y gestiona) la
representación del object, y mantiene la interfaz de salida del objeto.
● Producto: es el resultado de la “actividad” del Builder Pattern, es decir, el objeto que
se construye.
El director supervisa el proceso decisivo del patrón Builder: la separación de la creación de
un objeto/producto del cliente.
b) Desventajas
● El patrón Constructor consta de un fuerte vínculo entre el producto, el constructor
específico y las clases del proceso de diseño, así que puede ser difícil hacer cambios
en el proceso básico. La construcción de los objetos requiere conocer su uso y su
entorno concretos. Utilizar patrones conocidos, como el patrón de diseño Builder,
puede hacer que los programadores pasen por alto soluciones más sencillas y
elegantes. En el fondo, muchos desarrolladores consideran que este es uno de los
patrones de diseño menos importantes.
● La complejidad general del código aumenta, ya que el patrón exige la creación de
varias clases nuevas.
● Builder
#ifndef BUILDER
#define BUILDER
class Builder
{
public:
virtual ~Builder(){}
virtual void ProducirParedes() const = 0;
virtual void ProducirColumnas() const = 0;
virtual void ProducirTecho() const = 0;
virtual void ProducirPuertas() const = 0;
virtual void ProducirVentanas() const = 0;
};
#endif
● Builder Especifico
#ifndef BUILDER_ESPECIFICO
#define BUILDER_ESPECIFICO
#include"Producto.h"
#include"Builder.h"
~BuilderEspecifico(){
delete product;
}
void Reset(){
this->product = new Producto();
}
Producto * getProducto(){
Producto * resultado = this->product;
this->Reset();
return resultado;
}
};
#endif
● Director
#ifndef DIRECTOR
#define DIRECTOR
#include"Builder.h"
class Director {
private:
Builder* builder;
public:
void setBuilder(Builder* builder){
this->builder = builder;
}
void ConstruirCimientos(){
this->builder->ProducirParedes();
this->builder->ProducirColumnas();
}
void ConstruirCasaTechada(){
ConstruirCimientos();
this->builder->ProducirTecho();
}
void ConstruirCasaTerminada(){
ConstruirCasaTechada();
this->builder->ProducirPuertas();
this->builder->ProducirVentanas();
}
};
#endif
● Main
#include<iostream>
using namespace std;
#include"Director.h"
#include"Builder.h"
#include"BuilderEspecifico.h"
int main(){
return 0;
}
1.2 CAPTURAS
2. ABSTRACT FACTORY
La estructura de Abstract Factory puede resultar muy enredosa ya que tiene muchos
componentes y éstos aparentemente se mezclan entre sí. Para comprender mejor cómo
funciona este patrón explicaremos cada componente:
El patrón Abstract Factory nos ofrece una interfaz para crear objetos a partir de cada clase de
la familia de productos. Mientras tu código cree objetos a través de esta interfaz, no tendrás
que preocuparte por crear la variante errónea de un producto que no combine con los
productos que ya ha creado tu aplicación.
● Considera la implementación del patrón Abstract Factory cuando tengas una clase con
un grupo de métodos de fábrica que nublen su responsabilidad principal.
● En un programa bien diseñado cada clase es responsable tan solo de una cosa.
Cuando una clase lidia con varios tipos de productos, puede ser que valga la pena
extraer sus métodos de fábrica para ponerlos en una clase única de fábrica o una
implementación completa del patrón Abstract Factory.
Ventajas y desventajas
a) Ventajas
Puedes tener la certeza de que los productos que obtienes de una fábrica son
compatibles entre sí.
Evitas un acoplamiento fuerte entre productos concretos y el código cliente.
Principio de responsabilidad única. Puedes mover el código de creación de productos
a un solo lugar, haciendo que el código sea más fácil de mantener.
Principio de abierto/cerrado. Puedes introducir nuevas variantes de productos sin
descomponer el código cliente existente.
b) Desventajas
Puede ser que el código se complique más de lo que debería, ya que se introducen
muchas nuevas interfaces y clases junto al patrón.
2.1 IMPLEMENTACIÓN
● Abstract Factory
● Abstract Modern Product
● Old Products
● Factories
Enlace
3. PROTOTYPE
3.1 USO
Este patrón resulta útil en escenarios
donde es impreciso abstraer la lógica que
decide qué tipos de objetos utilizará una aplicación, de la lógica que luego usarán esos
objetos en su ejecución. Los motivos de esta separación pueden ser variados, como por
ejemplo:
● La aplicación debe basarse en alguna configuración o parámetro en tiempo de
ejecución para decidir el tipo de objetos que se debe crear.
● En ese caso, la aplicación necesitará crear nuevos objetos a partir de modelos.
● El modelo o prototipo es clonado y el nuevo objeto será una copia exacta de los mismos,
con el mismo estado.
3.2 Participantes
● Cliente: es el encargado de solicitar la creación de los nuevos objetos a partir de los
prototipos.
● Prototipo Concreto: posee características concretas que serán reproducidas para
nuevos objetos e implementa una operación para clonarse.
● Prototipo: declara una interfaz para clonarse, a la que accede el cliente.
El cliente solicita al prototipo que se clone.
3.3 Aplicabilidad
Ventajas
Desventajas
3.5 Implementación
4. Singleton
Patrón de diseño creacional que nos permite asegurarnos de que una clase tenga una única
instancia, a la vez que proporciona un punto de acceso global a dicha instancia.
Singleton nos permite acceder a un objeto desde cualquier parte del programa. No obstante,
también evita que otro código sobreescriba esa instancia.
Este problema tiene otra cara: no queremos que el código que resuelve el primer problema
se encuentre disperso por todo el programa. Es mucho más conveniente tenerlo dentro de
una clase, sobre todo si el resto del código ya depende de ella.
Hoy en día el patrón Singleton se ha popularizado tanto que la gente suele llamar singleton
a cualquier patrón, incluso si sólo resuelve uno de los problemas antes mencionados.
Todas las implementaciones del patrón Singleton tienen estos dos pasos en común:
● Hacer privado el constructor por defecto para evitar que otros objetos utilicen el
operador new con la clase Singleton.
● Crear un método de creación estático que actúe como constructor. Tras bambalinas,
este método invoca al constructor privado para crear un objeto y lo guarda en un campo
estático. Las siguientes llamadas a este método devuelven el objeto almacenado en
caché.
Si tu código tiene acceso a la clase Singleton, podrá invocar su método estático. De esta
manera, cada vez que se invoque este método, siempre se devolverá el mismo objeto.
IMPLEMENTACIÓN
#include <iostream>
class Singleton
{
protected:
Singleton() = default;
public:
int data;
};
int main()
{
singleton1.data = 20;
Singleton::get_instance().data = 50;
//singletonN.data = 100;
return 0;
}