En ingeniería de software, un patrón de diseño es una solución repetible general a un
problema común en el diseño de software. Un patrón de diseño no es un
diseño terminado que pueda transformarse directamente en código. Es una
descripción o plantilla sobre cómo resolver un problema que se puede utilizar
en muchas situaciones diferentes.
A principios de la década de 1990 los patrones de diseño tuvieron un
gran éxito en el mundo de la informática gracias a la publicación del
libro Design Patterns escrito
por el grupo Gang of Four (GoF)
compuesto por Erich Gamma, Richard Helm, Ralph
Johnson y John Vlissides, en el que se recogían 23 patrones de diseño
comunes.
Los patrones GoF se dividen en tres tipos fundamentales,
agrupados según el tipo de soluciones que aplican.
- Los
patrones creacionales, que son aquellos que aplican soluciones que crean
objetos de manera determinada. De este
modo buscan encapsular la instanciación de objetos dentro de los métodos de
otros objetos opacos, ocultándola al usuario del código.
- Los
patrones estructurales, que abstraen la composición de interfaces a través
de otros recursos, como la herencia o la agregación. Se encargan de proporcionar al usuario del código
un objeto de firma simple que agrupa múltiples objetos de manera opaca.
- Los patrones de comportamiento, que buscan proporcionar al usuario del código objetos que aporten una funcionalidad determinada. De este modo los objetos presentan una firma cuyos métodos resuelven un problema específico sin exponer su funcionamiento.
PATRONES CREACIONALES
Estos patrones de
diseño tienen que ver con la creación de instancias de clase. Este patrón
se puede dividir en patrones de creación de clases y patrones de creación de
objetos. Mientras que los patrones de creación de clases usan la herencia
de manera efectiva en el proceso de creación de instancias, los patrones de
creación de objetos usan la delegación de manera efectiva para hacer el
trabajo.
Abstract Factory/Fabrica
Abstracta: Este patrón
creacional proporciona una interfaz para crear familias de objetos relacionados
o que dependen entre sí, sin especificar sus clases concretas. Puede ser
utilizado cuando:
- Un
sistema debe ser independiente de cómo se crean, componen y representan
sus productos.
- Un
sistema debe ser configurado como una familia de productos entre varias.
- Una
familia de objetos producto relacionados está diseñada para ser usada
conjuntamente, y es necesario hacer cumplir esta restricción.
- Se
quiere proporcionar una biblioteca de clases de productos, y solo quiere
revelar sus interfaces, no sus implementaciones.
Abstract Factory define un método de fábrica por
producto. Cada Método de Fábrica encapsula al new operador y las clases
concretas de productos específicos de la plataforma. Cada
"plataforma" se modela con una clase derivada de Factory.
El
propósito de Abstract Factory es proporcionar una interfaz para crear familias
de objetos relacionados, sin especificar clases concretas. Este patrón se
encuentra en el equipo de estampado de chapa utilizado en la fabricación de
automóviles japoneses. El equipo de estampado es una Fábrica abstracta que
crea partes del cuerpo del automóvil. La misma maquinaria se utiliza para
estampar puertas derechas, puertas izquierdas, guardabarros delanteros
derechos, guardabarros delanteros izquierdos, capós, etc. para diferentes
modelos de automóviles. Mediante el uso de rodillos para cambiar los
troqueles de estampado, las clases de concreto producidas por la maquinaria se
pueden cambiar en tres minutos.
Builder/Constructor: Separa la construcción de un objeto complejo de su
representación, de forma que el mismo proceso de construcción pueda crear
diferentes representaciones. Suele utilizarse cuando:
- El algoritmo para crear un
objeto complejo debiera ser independiente de las partes de que se compone
dicho objeto y de cómo se ensamblan
- El proceso de construcción debe permitir diferentes representaciones del objeto que está siendo construido.
El lector encapsula el análisis de la entrada
común. La jerarquía de constructores hace posible la creación polimórfica
de muchas representaciones u objetivos peculiares.
El patrón
Builder separa la construcción de un objeto complejo de su representación para
que el mismo proceso de construcción pueda crear diferentes
representaciones. Este patrón es utilizado por los restaurantes de comida
rápida para construir las comidas de los niños. Las comidas para niños
generalmente consisten en un artículo principal, un artículo secundario, una
bebida y un juguete (por ejemplo, una hamburguesa, papas fritas, Coca-Cola y un
dinosaurio de juguete). Tenga en cuenta que puede haber variaciones en el
contenido de la comida de los niños, pero el proceso de construcción es el
mismo. Ya sea que un cliente ordene una hamburguesa, una hamburguesa con
queso o un pollo, el proceso es el mismo. El empleado en el mostrador
dirige a la tripulación a ensamblar un artículo principal, un artículo
secundario y un juguete. Estos artículos se colocan en una bolsa. La
bebida se coloca en una taza y permanece fuera de la bolsa. Este mismo
proceso se usa en restaurantes competidores.
Factory Method/Método de Fabrica: Define una interfaz para crear un objeto, pero deja que sean las subclases quienes decidan que clase instanciar. Permite que una clase delegue en sus subclases la creación de objetos. Suele usarse cuando:
- Una clase no puede prever la
clase de objetos que debe crear.
- Una clase quiere que sean
sus subclases quienes especifiquen los objetos que esta crea.
- Las clases delegan la
responsabilidad en una de entre varias clases auxiliares, y se quiere
localizar que subclase de auxiliar concreta es en la que se delega.
La implementación del Factory Method discutido por
el grupo Gang
of Four se superpone en gran medida con la de Abstract
Factory. Por esa razón, la presentación de este patrón se centra en el enfoque
que se ha vuelto popular desde entonces.
Una definición cada vez más popular del Factory Method es: un static método de una clase que devuelve un objeto del tipo de esa clase. Pero a diferencia de un constructor, el objeto real que devuelve podría ser una instancia de una subclase. A diferencia de un constructor, un objeto existente podría reutilizarse, en lugar de crearse un nuevo objeto. A diferencia de un constructor, los métodos de fábrica pueden tener nombres diferentes y más descriptivos (por ejemplo, Color.make_RGB_color (float red, float green, float blue) y Color.make_HSB_color (float hue, float saturation, float brightness).
El cliente está totalmente desacoplado de los detalles de implementación
de las clases derivadas. La creación polimórfica ahora es posible.
El Factory
Method define una interfaz para crear objetos, pero permite que las subclases
decidan qué clases instanciar. Las prensas de moldeo por inyección
demuestran este patrón. Los fabricantes de juguetes de plástico procesan
polvo de moldeo de plástico e inyectan el plástico en moldes de las formas
deseadas. La clase de juguete (automóvil, figura de acción, etc.) está
determinada por el molde.
Prototype/Prototipo: Especifica
los tipos de objetos a crear por medio de una instancia prototípica, y crea
nuevos objetos copiando dicho prototipo. Se utiliza cuando un sistema deba ser
independiente de cómo se crean, se componen y se representan sus productos, así
como también:
- Cuando
las clases a instanciar sean especificadas en tiempo de ejecución (por
ejemplo, mediante carga dinámica).
- Para
evitar construir una jerarquía de clases de fábricas paralela a la
jerarquía de clases de los productos.
- Cuando las instancias de una clase puedan tener uno de entre solo unos pocos estados diferentes. Puede ser más adecuado tener un número equivalente de prototipos y clonarlos, en vez de crear manualmente instancias de la clase cada vez con el estado apropiado.
La
fábrica sabe cómo encontrar el prototipo correcto, y cada producto sabe cómo
generar nuevas instancias de sí mismo.
Singleton/Único: Garantiza que una clase solo tenga una instancia, y
proporciona un punto de acceso global a ella. Se utiliza el patrón Singleton
cuando:
- Se debe hacer exactamente
una instancia de una clase, y esta deba ser accesible a los clientes desde
un punto de acceso conocido.
- La única instancia debería ser extensible mediante herencia, y los clientes deberían ser capaces de usar una instancia extendida sin modificar su código.
Permite
que la clase de la instancia única sea responsable del acceso y la
"inicialización en el primer uso". La instancia única es un
atributo estático privado. La función de acceso es un método público
estático.
El patrón
Singleton garantiza que una clase tenga solo una instancia y proporciona un
punto de acceso global a esa instancia. Lleva el nombre del conjunto
singleton, que se define como un conjunto que contiene un elemento. La
oficina del Presidente de los Estados Unidos es Singleton. La Constitución
de los Estados Unidos especifica los medios por los cuales se elige a un
presidente, limita el mandato y define el orden de sucesión. Como resultado,
puede haber como máximo un presidente activo en un momento
dado. Independientemente de la identidad personal del presidente activo,
el título, "El presidente de los Estados Unidos" es un punto de
acceso global que identifica a la persona en la oficina.
En
el siguiente vídeo se explicará mediante un ejemplo el uso de este patrón:
PATRONES ESTRUCTURALES
Los
patrones estructurales se ocupan de combinar clases y objetos para formar
estructuras más complejas. Los patrones estructurales de clases utilizan la
herencia múltiple para componer interfaces, mientras que los patrones
estructurales de objetos sirven para crear nuevas funcionalidades al mismo. La
ventaja de estos patrones es que agregan a la estructura flexibilidad y que la
misma puede cambiar en tiempo de ejecución, lo cual es imposible con una
composición de clases estáticas.
Dentro de
los patrones de diseño estructurales tenemos: Adapter (estructural de clases y
objetos), Bridge (estructural de objetos), Composite (estructural de objetos),
Decorator (estructural de objetos), Facade (estructural de objetos), Flyweight
(estructural de objetos) y Proxy (estructural de objetos).
Adapter/Adaptador: Es capaz de convertir la interfaz de una clase a
otra interfaz que esperan los clientes, cuando sea necesario usar una clase ya
existente pero su interfaz no concuerde con lo que se necesita. Por otro lado,
permite que cooperen clases que de otra forma no podrían por tener interfaces
incompatibles, debido a que en ocasiones se crean clases reutilizables para que
cooperen con otras clases no relacionadas y es por ello que no contienen
interfaces compatibles.
El adaptador consiste en crear
una abstracción intermedia que traduzca, o asigne, el componente antiguo al
nuevo sistema. Los clientes llaman a métodos en el objeto Adaptador que
los redirige a llamadas al componente heredado. Esta estrategia se puede
implementar con herencia o con agregación. El adaptador funciona como un
contenedor o modificador de una clase existente. Proporciona una vista
diferente o traducida de esa clase.
Supongamos que, el
"display()" método de un componente Rectangle
heredado espera recibir los parámetros "x, y, w, h". Pero
el cliente quiere pasar "superior izquierda x e y" e "inferior
derecha x e y". Esta incongruencia se puede remediar agregando un nivel
adicional de indirección, es decir, un objeto Adaptador.
El adaptador también podría
considerarse como un "envoltorio".
El
patrón Adaptador permite que las clases incompatibles trabajen juntas al
convertir la interfaz de una clase en una interfaz esperada por los
clientes. Las llaves de vaso proporcionan un ejemplo del
adaptador. Se conecta un zócalo a un trinquete, siempre que el tamaño de
la unidad sea el mismo. Los tamaños de unidad típicos en los Estados
Unidos son 1/2 "y 1/4". Obviamente, un trinquete de 1/2 "no
encajará en un receptáculo de 1/4" a menos que se use un
adaptador. Un adaptador de 1/2 "a 1/4" tiene una conexión hembra
de 1/2 "para encajar en el trinquete de accionamiento de 1/2", y una
conexión macho de 1/4 "para encajar en el zócalo de accionamiento de
1/4".
Bridge/Puente: Su principal intención es desacoplar una abstracción de su
implementación para que los dos puedan variar de forma independiente.
Puente es
sinónimo del lenguaje "manejar / cuerpo". Este es un mecanismo
de diseño que encapsula una clase de implementación dentro de una clase de
interfaz. El primero es el cuerpo, y el segundo es el mango. El
usuario ve el identificador como la clase real, pero el trabajo se realiza en
el cuerpo. "El idioma de clase de identificador / cuerpo se puede
usar para descomponer una abstracción compleja en clases más pequeñas y más
manejables. El idioma puede reflejar el intercambio de un solo recurso por
múltiples clases que controlan el acceso a él (por ejemplo, el recuento de
referencias)".
Bridge enfatiza la identificación
y desacoplamiento de la abstracción de "interfaz" de la abstracción
de "implementación".
Composite/Compuesto: Se encarga de componer objetos en estructuras
de árbol para representar jerarquías de partes enteras. Compuesto permite
a los clientes tratar objetos individuales y composiciones de objetos de manera
uniforme.
Compuestos que contienen
componentes, cada uno de los cuales podría ser un compuesto.
Menús que contienen elementos de
menú, cada uno de los cuales podría ser un menú.
Administradores de diseño de GUI
de fila-columna que contienen widgets, cada uno de los cuales podría ser un
administrador de diseño de GUI de columna-fila.
Directorios que contienen
archivos, cada uno de los cuales podría ser un directorio.
Contenedores que contienen
elementos, cada uno de los cuales podría ser un contenedor.
Aunque el ejemplo es abstracto,
las expresiones aritméticas son compuestos. Una expresión aritmética
consiste en un operando, un operador (+ - * /) y otro operando. El
operando puede ser un número u otra expresión aritmética. Por lo tanto, 2
+ 3 y (2 + 3) + (4 * 6) son expresiones válidas.
Decorator/Decorador: Se emplean para asignar responsabilidades
adicionales a un objeto dinámicamente. Los decoradores proporcionan una
alternativa flexible a la herencia para ampliar la funcionalidad.
Suponga
que está trabajando en un kit de herramientas de interfaz de usuario y desea
admitir la adición de bordes y barras de desplazamiento a las
ventanas. Podría definir una jerarquía de herencia como ...
Pero
el patrón Decorador sugiere dar al cliente la capacidad de especificar
cualquier combinación de "características" que se desee.
Esta
flexibilidad se puede lograr con el siguiente diseño:
Otro ejemplo: el arma de asalto
es un arma mortal en sí misma. Pero puede aplicar ciertas
"decoraciones" para hacerlo más preciso, silencioso y devastador.
Facade/Fachada: Proporciona
una interfaz unificada para un conjunto de interfaces de un subsistema. Define
una interfaz de alto nivel que hace que el subsistema sea más fácil de usar.
SubsystemOne
y SubsystemThree no interactúan con los componentes internos de SubsystemTwo.
Utilizan la SubsystemTwoWrapper "fachada" (es decir, la abstracción
de nivel superior).
Los
consumidores encuentran una Fachada cuando hacen un pedido desde un
catálogo. El consumidor llama a un número y habla con un representante de
servicio al cliente. El representante de servicio al cliente actúa como
una fachada, proporcionando una interfaz para el departamento de cumplimiento
de pedidos, el departamento de facturación y el departamento de envío.
Flyweight/Peso ligero: Usa compartimiento para permitir grandes
cantidades de objetos de grano fino de manera eficiente.
El patrón
Flyweight describe cómo compartir objetos para permitir su uso con granularidad
fina sin costo prohibitivo. Cada objeto "flyweight" se divide en dos
partes: la parte dependiente del estado (extrínseca) y la parte independiente
del estado (intrínseca). El estado intrínseco se almacena (comparte) en el
objeto Flyweight. El estado extrínseco es almacenado o calculado por los
objetos del cliente, y se pasa al Flyweight cuando se invocan sus operaciones.
El
cliente se abstiene de crear Flyweights directamente y los solicita a Factory.
Flyweight
utiliza el uso compartido para admitir grandes cantidades de objetos de manera
eficiente. Los navegadores web modernos usan esta técnica para evitar
cargar las mismas imágenes dos veces. Cuando el navegador carga una página
web, atraviesa todas las imágenes de esa página. El navegador carga todas
las imágenes nuevas de Internet y las coloca en la memoria caché
interna. Para las imágenes ya cargadas, se crea un objeto Flyweight, que
tiene algunos datos únicos como la posición dentro de la página, pero todo lo
demás está referenciado al caché.
Proxy/Apoderado: Proporciona
un representante o sustituto de otro objeto para controlar el acceso a éste.
Hay
cuatro situaciones comunes en las que se aplica el patrón Proxy.
·
Un proxy virtual es un marcador de posición
para objetos "caros de crear". El objeto real solo se crea cuando un
cliente primero solicita / accede al objeto.
·
Un proxy remoto proporciona un representante
local para un objeto que reside en un espacio de direcciones diferente. Esto es
lo que proporciona el código de "código auxiliar" en RPC y CORBA.
·
Un proxy de protección controla el acceso a un
objeto maestro sensible. El objeto "sustituto" verifica que la
persona que llama tenga los permisos de acceso requeridos antes de reenviar la
solicitud.
·
Un proxy inteligente interpone acciones
adicionales cuando se accede a un objeto. Los usos típicos incluyen:
§ Contando
el número de referencias al objeto real para que pueda liberarse
automáticamente cuando no haya más referencias (también conocido como puntero
inteligente),
§ Cargando
un objeto persistente en la memoria cuando se hace referencia por primera vez,
§ Comprobar
que el objeto real esté bloqueado antes de acceder a él para asegurarse de que
ningún otro objeto pueda cambiarlo.
Al
definir una interfaz Subject, la presencia del objeto Proxy en lugar del
RealSubject es transparente para el cliente.
El
Proxy proporciona un sustituto o un titular de lugar para proporcionar acceso a
un objeto. Un cheque o giro bancario es un proxy de fondos en una
cuenta. Se puede usar un cheque en lugar de efectivo para realizar compras
y, en última instancia, controla el acceso al efectivo en la cuenta del emisor.
Buenas, Tengo una duda con respecto a los patrones de comportamiento que a la fecha de realizar este comentario no están definidos como los dos anteriores. Guiándome con la pequeña definición al principio ¿Estos vendrían siendo como librerías externas u "objetos" que se implementan sin que sea expuesto el código en el programa original?
ResponderBorrarPatrones de comportamiento lo detallarán otros compañeros, pero respondiendo a tu pregunta: No, todos los patrones cuentan con una estructura y su implementación está en el código original. Se podría decir que estos patrones son un poco más complejos que los explicados en esta entrada. Su funcionamiento no se puede visualizar bien en el método main, pero si revisamos los métodos instanciados podemos saber como funcionan.
BorrarCompañeros, según ustedes que es lo primero que debe hacer el programador para identificar que patrón a implementar es el más optimo para su programa?
ResponderBorrarEn primer lugar se debe tener bien claro el problema que se desea resolver, de manera que el programador pueda elegir a aquellos patrones cuyos nombres llamen su atención, porque como podrás darte cuenta los patrones tienen nombres bastante expresivos que técnicamente te indica su funcionalidad, así el programador podrá indagar mas sobre ellos y en tal caso probarlos en su código y darse cuenta de cual es el mas efectivo.
BorrarEs impresionante el mundo de los diseños de patrones, sobre todo en los estructurales debido a que su funcionalidad es permitir que las lineas de códigos sean mas flexibles al momento de cambiarlas e incluso que se puedan cambiar mientras se encuentran en tiempo de ejecución lo cual se caracteriza como una excepcional herramienta puesto a que esos cambios no se creía posible realizarlos cuando se empezó con todo éste mundo de la programación o por lo menos que no se habían tomado la molestia hasta como lo mencionaron "A principios de la década de 1990 los patrones de diseño tuvieron un gran éxito en el mundo de la informática".
ResponderBorrarEl diseño de patrones es un concepto, que se puede ver en otras áreas de estudio, como lo es la arquitectura y la planificación de ciudades, y el desarrollo de software no esta exento de él. Ademas el aporte de estos patrones es enorme debido al valor extra que proporcionan los mismos al programador, permitiendo un cambio significativo en la manera como este estructurara sus proyectos tomando en cuenta diseño mas en terminos de como funcionara el programa en su totalidad y no tanto en pequeñas funciones.
ResponderBorrarCuando utilizo la clase Singleton, puedo colocar arrays de diferentes tipos de datos y realizar de la misma forma una sola instancia de la clase singleton? o debo crear otra clase Singleton para declarar todas estas variables u otros tipos de datos en el arrays que se deseen agregar?
ResponderBorrarComo mostramos en el video, lo primero que debemos hacer es crear las clases que definan las características de los datos, luego en la clase singleton se crean los arraylist, para que luego en el main se instancie la clase singleton y se envíen los parámetros, según el objeto, que se guardaron en los arraylist.
BorrarMuy interesante la información presentada, ya que hoy día, con el avance de la tecnología, el uso de los patrones de diseño ( GoF), se vuelven cada día más indispensables para la construcción de software reutilizable, aunque es algo extraño que al momento de la codificación, cuando hacemos uso del patrón no se evidencia a simple vista. Existen una gran variedad de patrones GoF indispensables pero su uso se vuelve en ocasiones muy reducido ya sea por la falta de experiencia al emplearlo o por no conocer en si sus virtudes.
ResponderBorrarComplementando el comentario de mi compañera, me gustaría saber por que no es evidente el uso del patrón en el código?. Y si yo como programador estoy empleando técnicas nuevas que llevan a nuevos descubrimientos, como puedo saber que he descubierto un nuevo patrón de diseño, es decir, existe algún parámetro que me diga que “esto”(lo que estoy descubriendo) es un patrón de diseño?
ResponderBorrarLos patrones de diseño son complejos, y no todos los programadores los conocen, es por ello que revisando un código no sean capaces de evidenciar la presencia de un patrón. Y con respecto a la otra pregunta, los patrones deben cumplir con ciertas características: representar problemas comunes en el desarrollo de software, no solamente un problema en particular de mi software, y brindar una solución creando una nueva clase, métodos, nuevos comportamientos, etc; además que el código sea reutilizable. Cabe destacar que descubrir un patrón implica la aprobación de la comunidad de programadores.
BorrarEs importante aportar que no todas las situaciones son candidatas para el uso de patrones de diseño. los patrones de diseño según Gof permite describir soluciones simples y elegantes para problemas específicos que pueden presentarse en el desarrollo de una aplicación. La información publicada en este blog es muy interesante, dando a conocer las 3 categorías que surgen del análisis de los problemas mas recurrentes en el desarrollo de software, las cuales se clasifican y se agrupan a partir de su propósito y su alcance como esta descrito en el blog. No hay que olvidar que todos los patrones no pueden ser utilizados en la resolución de cualquier problema, ya que todos no son aplicables para cualquier situación, se debe hacer un estudio, establecer criterios y análisis para identificar los patrones de diseños que son aplicables de acuerdo a con su categoría.
ResponderBorrarEn los patrones creacionales se encuentran presentes distintos patrones como el Singlenton y el Builder. Ahora bien, ¿Se tienen que usar cada uno de estos patrones para obtener un buen patrón creacional o existe uno que ustedes consideren el mas efectivo a usar?
ResponderBorrarNo es necesario implementar todos los patrones en un programa, debido a que cada uno de ellos cumplen una función distinta y su implementación dependerá de la función del programa. En ocasiones se podrán utilizar varios, así como también puede suceder en otras que con uno solo se puede ayudar a cumplir el objetivo del programa.
BorrarLos patrones GoF aportan al programador soluciones a secciones específicas del código, algunos de estos se centran en aspectos importantes como lo son las clases y objetos, ya sea para crearlos o modificarlos. Estos patrones no son usados comúnmente por personas que están iniciando en la programación pero se puede considerar como una buena practica si se conoce como emplearlos.
ResponderBorrarReferente a lo expuesto, pude observar que hablan de objetos opacos, a que se refieren con eso? Además, ¿los patrones GoF solo trabajan con las clases y los objetos?
ResponderBorrarLos objetos opacos son aquellos que su forma y tamaño no son visibles para los clientes o usuarios y de los cuales tampoco conocen su implementación subyacente; y los patrones GoF trabajan con clases, objetos e interfaces.
BorrarCompañeros, En su ejemplo en el vídeo no usar el patrón Singleton representaría desventaja a la hora de realizar el programa.
ResponderBorrarHola amigo, con solo llamar al Singleton ya tengo todas las instancias de los datos guardados, accedes fácilmente a ellos solo con el nombre de la variable, de lo contrario trabajarías a cada una independientemente y es complicado mantener la sincronía, por lo tanto si representaría una desventaja.
BorrarLos patrones GoF representan soluciones standard a problemas recurrentes y son diseñados para un problema en específico, pero de forma general como para poder adecuarse a futuros requisitos y problemas; no obstante reutilizan soluciones que han sido útiles en el pasado. También se debe tener en cuenta que a la hora de aplicar un patron GoF se debe conocer en gran parte la solución genérica que brinda cada patrón y el tipo de problemática que resuelven, además de evaluar la posibilidad de aplicar el o los patrones en el problema correspondiente.
ResponderBorrarCada desarrollador debería conocer estos patrones, especialmente los clásicos GoF. Aunque se debe entender muy bien su funcionalidad para poder utilizarlos y que cumplan su cometido, son una gran solución a la hora de codificar debido a que fueron creados y probados para solucionar un problema en específico de una forma bastante limpia y reusable.
ResponderBorrarLos patrones GoF. Ayudan al programador a solucionar problemas en el código ya que esta diseñado para resolver un problema en especifico. Al fin y al cabo este patrón ayudará a agilizar y brindar una mejor comprensión del proyecto.
ResponderBorrarChicos, podrían listar por qué motivo o motivos la implementación de un patrón de diseño representa un ahorro significativo de tiempo, en el desarrollo de software? Para que todos los tengamos presentes!
ResponderBorrarEl motivo principal es que el patrón es una solución, por lo tanto no debemos estar rebuscando y pensando más de lo debido en como resolver algo de lo cual la solución ya está creada, se perdería mucho tiempo tratando de crear algo nuevo, es por eso que los programadores deben conocer estos patrones y al momento de tener un problema en el desarrollo ya tener noción de que patrones se pudieran implementar y así ahorrar tiempo.
BorrarCada patrón nos brinda una solución a problemas que ocurre cuando se desarrolla un software. Permitiéndonos entender o como adaptarlo a un problema en particular que se nos presente. Los patrones facilitan la reutilización de diseños que han tenido éxito, describen soluciones simples y elegantes para problemas específicos.
ResponderBorrar¿Es conveniente usar los patrones estructurales que forman estructuras mas complejas para agilizar códigos?
ResponderBorrarNo solo es conveniente usar los patrones estructurales, todos los patrones de diseño (tanto creacionales, estructurales y de comportamiento) te van a permitir agilizar mucho mas tu trabajo y hacerlo de mejor comprensión para los demás.
ResponderBorrar