# Design patterns: programar de manera más rápida y segura

Cada diseño tiene su patrón y todo tiene su propio modelo, sea una taza, una casa o un vestido. A nadie se le ocurriría la idea de poner el asa de una taza al interior de la misma, ya que para la utilización práctica está demostrado que es mejor colocar este elemento en el exterior. Por esto, si vas a un curso de alfarería y quieres hacer una vasija con asas, ya conoces la **forma básica**; en tu cabeza ya está guardada como **patrón de diseño**.

El mecanismo es similar con los programas informáticos. Hay determinados procesos que siempre se repiten, de tal forma que solo hay que dar un pequeño paso para crear un patrón. A continuación explicamos cómo estos *design* *patterns* (patrones de diseño) te pueden **facilitar las tareas de programación**.

## ¿Qué son los design patterns?

El concepto *design* *pattern* se remonta al arquitecto norteamericano Christopher Alexander, que reunió **patrones reutilizables** formando una colección. Su intención era **involucrar** a los futuros usuarios de las construcciones **en el proceso de diseño**. Esta idea fue entonces adoptada por un número de científicos informáticos. El denominado Gang of Four (GoF) —Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides— contribuyó en el año 1994 al éxito de los ***software patterns*** con su libro *Design Patterns – Elements of Reusable Object-Oriented Software*.

[![Imagen: Aplicación de los design patterns](https://www.ionos.mx/digitalguide/fileadmin/_processed_/3/0/csm_aplicacion-de-los-design-patterns_66c4c2eab3.webp "Aplicación de los design patterns")](https://www.ionos.mx/digitalguide/fileadmin/DigitalGuide/Schaubilder/aplicacion-de-los-design-patterns.png) Proceso esquemático simplificado del desarrollo de software: comprobamos cinco design patterns diferentes para solucionar tareas de programación.       Entonces, ¿Qué son los design patterns? Vamos a continuar utilizando nuestro ejemplo anterior: para cada taza —ya sea de café o de té— siempre se necesitan los **mismos elementos básicos**: base, paredes y asa. Esto sucede de manera similar en la programación: los bucles que se deben recorrer siempre están vinculados a los requisitos iniciales y finales; una condición siempre requiere una decisión sobre lo que ocurre si se cumplen estos requisitos y lo que ocurre si no se cumplen; un cálculo siempre da como resultado la combinación de variables, etc. A partir de muchos de estos pasos de programación individuales se crea una **secuencia de programa** que siempre se desarrolla de la misma manera para determinadas tareas. Los patrones de diseño de *software* son una descripción de cómo resolver un problema.

A continuación presentamos un **ejemplo** muy sencillo de un *software* *pattern*, en este caso, un *factory pattern*:

```none
class Tazas
{
    private $tazaMake;
    private $tazaModel;
    public function __construct($make, $model)
    {
        $this->tazaMake = $make;
        $this->tazaModel = $model;
    }
    public function getMakeAndModel()
    {
        return $this->tazaMake . ' ' . $this->tazaModel;
    }
}
class TazasFabric
{
    public static function create($make, $model)
    {
        return new Taza($make, $model);
    }
}
$expreso = TazasFabric::create('Taza', 'Expreso'); // El objeto se ha creado
print_r($expreso->getMakeAndModel()); // Salida "Taza Expreso"
```

Lo mismo es aplicable a contextos y procesos más amplios que se utilizan de manera recurrente para resolver ciertas tareas en las secuencias de programas. El ejemplo de código se puede ampliar a voluntad y también aplicar a otros sectores, productos y procesos diferentes. Además, por supuesto, solo se trata de un componente dentro un *software* más completo. De esta forma, los patrones de diseño se entienden como **esquemas** que ya se han probado en la práctica.

## ¿Qué tipo de design patterns hay?

Los tipos de patrones de diseño representan las **áreas de aplicación** básicas de los patrones de *software* que reúnen.

### Patrón de estructura

Los ***structural* *patterns*** son plantillas ya listas para relaciones entre clases. El objetivo es lograr una abstracción que también se pueda comunicar con otros enfoques de solución. El concepto clave es la programación de interfaces.

### Patrón de comportamiento

Con los ***behavioral patterns*** se modela el comportamiento del *software*. Estos patrones simplifican los complejos procesos de control. Para ello, se puede elegir entre algoritmos y las responsabilidades de los objetos.

### Patrón de creación

Con los ***creational patterns*** se crean objetos que permiten una representación simplificada de los procesos para determinadas instancias. Este proceso funciona independientemente de la manera en la que cada uno de los objetos se cree y se represente en un *software*.

Con el paso del tiempo, han surgido **más tipos de patrones de diseño** que no encajan en ninguna de las categorías mencionadas. Entre ellos se encuentran los patrones para el **mapeo objeto-relacional**, con los que se almacenan los objetos y sus relaciones en una base de datos relacional.

## Luces y sombras de la utilización de los design patterns

### Ventajas

La posibilidad de recurrir a **planteamientos de solución probados** va acompañada de un **ahorro de tiempo y costes**. Los equipos de desarrolladores no necesitan inventar una y otra vez la máquina para resolver, en cada nuevo flujo de programa, subtareas que ya se han resuelto en multitud de ocasiones. Las denominaciones de los patrones suelen provenir de un **vocabulario de diseño común** que simplifica tanto la comunicación entre desarrolladores como con el usuario de la futura solución. También la **documentación** de un *software* se **simplifica** cuando se utilizan componentes ya documentados. Estas ventajas también se aprovechan durante el mantenimiento y posterior desarrollo de un programa.

### Inconvenientes

El tratamiento de los patrones de diseño requiere **amplios conocimientos** previos. La disponibilidad de los *design* *patterns* también puede inducir a creer que, si se cuenta con patrones de diseño, aparentemente todos los problemas quedan resueltos. En resumen: la **creatividad puede quedar limitada**, al igual que la curiosidad para encontrar nuevas (y mejores) soluciones.

## ¿Qué design patterns conocidos hay?

Existen más de **setenta patrones de diseño** que pertenecen a diferentes categorías. Algunos *software* *patterns* importantes son, por ejemplo, los siguientes:

### Patrón de creación

- **[Builder pattern](https://www.ionos.mx/digitalguide/paginas-web/desarrollo-web/patron-de-diseno-builder/):** el **constructor** de la categoría del patrón de creación separa el desarrollo de objetos (complejos) de sus representaciones.
- **[Factory pattern](https://www.ionos.mx/digitalguide/paginas-web/desarrollo-web/patron-factory/):** este patrón de diseño genera un objeto a modo de patrón de creación recurriendo a un método en lugar de un constructor.
- **[Singleton pattern](https://www.ionos.mx/digitalguide/paginas-web/desarrollo-web/patron-singleton/):** la **instancia única** garantiza, como patrón de creación, que únicamente exista solo un objeto en cada clase. Además, el *singleton* está disponible a nivel global.

### Patrón de estructura

- **[Composite pattern](https://www.ionos.mx/digitalguide/paginas-web/desarrollo-web/patron-composite/):** un patrón de estructura **compuesto** que está especialmente orientado al tratamiento de estructuras dinámicas, por ejemplo para la organización de archivos o la compresión de datos.
- **[Decorator pattern](https://www.ionos.mx/digitalguide/paginas-web/desarrollo-web/que-es-el-patron-de-diseno-decorator/):** el llamado **decorador** integra más funciones o competencias en clases existentes.
- **[Facade pattern](https://www.ionos.mx/digitalguide/paginas-web/desarrollo-web/facade-pattern/):** la **fachada** representa la interfaz para los demás sistemas y sub-sistemas.

### Patrón de comportamiento

- **[Observer pattern](https://www.ionos.mx/digitalguide/paginas-web/desarrollo-web/que-es-el-patron-observer/):** el **observador** transmite las modificaciones de un objeto a estructuras que dependen del objeto inicial.
- **[Strategy pattern](https://www.ionos.mx/digitalguide/paginas-web/desarrollo-web/strategy-pattern/):** la **estrategia** define una familia de algoritmos intercambiables.
- **[Visitor pattern](https://www.ionos.mx/digitalguide/paginas-web/desarrollo-web/visitor-pattern/):** el **visitante** aísla operaciones ejecutables, de tal forma que se puedan llevar a cabo nuevas operaciones sin modificar las clases afectadas.

---

### En resumen

Los *design* *patterns* presentan patrones listos para utilizar con los que, para solucionar un problema explícito, se recurre a un **concepto probado**. El patrón se basa en *software* *designs* existentes e involucra al usuario de la futura solución en el proceso de diseño. Los patrones de diseño **no están ligados a ningún lenguaje de programación**, lo que hace que su utilización sea universal.

---


This is a markdown version of: [https://www.ionos.mx/digitalguide/paginas-web/desarrollo-web/que-son-los-design-patterns/](https://www.ionos.mx/digitalguide/paginas-web/desarrollo-web/que-son-los-design-patterns/) for AI/LLM consumption.