Los patrones de diseño en ingeniería de software son soluciones reutilizables a problemas comunes que se presentan en el desarrollo de software.
Estos patrones son guías para la estructuración de código y ayudan a mejorar la escalabilidad, mantenibilidad y la calidad general de las aplicaciones.
Se pueden dividir en tres categorías principales:
Patrones Creacionales: Se enfocan en la manera en que se crean los objetos, asegurando que el proceso sea flexible y reutilizable.
Patrones Estructurales: Ayudan a la composición de clases u objetos para formar estructuras más complejas y eficientes.
Patrones de Comportamiento: Se centran en cómo los objetos se comunican e interactúan.
¿Cómo funcionan?
Los patrones de diseño proporcionan un esquema o plan de cómo resolver un problema específico en un contexto particular. Funcionan como una plantilla que podemos adaptar a nuestras necesidades, en lugar de copiar y pegar código. Siempre es importante hacer un buen análisis antes de implementar un patrón para ver si verdaderamente es la solución que necesitamos.
Vamos a comenzar con un patrón que ya hemos visto en clase y lo hemos usado para la conexión a bases de datos, el Patrón Singleton, que es un patrón de diseño creacional. Este patrón garantiza que una clase tenga una única instancia y proporciona un punto de acceso global a esa instancia. Es útil, por ejemplo, en la gestión de conexiones a bases de datos como ya lo hemos mencionado.
<?php
class Singleton {
private static $instance = null; // La única instancia de la clase
private $data; // Un atributo de ejemplo
// Constructor privado para evitar la creación de instancias directas
private function __construct() {
$this->data = "Información de la instancia Singleton";
}
// Método estático que devuelve la única instancia de la clase
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new Singleton();
}
return self::$instance;
}
// Método de ejemplo para obtener los datos
public function getData() {
return $this->data;
}
}
// Ejemplo de uso
$singleton1 = Singleton::getInstance();
$singleton2 = Singleton::getInstance();
// Verificar que ambas instancias sean la misma
echo $singleton1->getData(); // Imprime "Información de la instancia Singleton"
echo ($singleton1 === $singleton2) ? 'Son la misma instancia' : 'Son instancias diferentes';
?>
Explicación del patrón mencionado arriba
Constructor privado: Evita que la clase sea instanciada directamente con new.
Método getInstance(): Comprueba si la instancia ya existe; si no, la crea. Luego devuelve esa única instancia.
Una sola instancia: Cualquier llamada a Singleton::getInstance() siempre devolverá la misma instancia.
Este patrón es útil cuando necesitas controlar un recurso único como un logger o una conexión a la base de datos, evitando múltiples conexiones o instancias innecesarias.
En el desarrollo de aplicaciones web, se utilizan varios patrones de diseño que ayudan a gestionar la complejidad y a organizar el código de manera eficiente. Vamos a ver algunos más que podemos implementar en nuestros proyectos del CTT
MVC (Model-View-Controller)
El patrón MVC es muy popular en el desarrollo web, ya que separa la lógica de la aplicación en tres componentes principales:
Model (Modelo): Maneja la lógica de la aplicación y la interacción con la base de datos.
View (Vista): Representa la interfaz de usuario.
Controller (Controlador): Actúa como un intermediario entre el modelo y la vista, gestionando la entrada del usuario y la lógica de la aplicación.
Este patrón permite un desarrollo modular y facilita el mantenimiento, ya que las responsabilidades están claramente definidas.
Este ejemplo que vamos a ver a continuación, simulará un sistema básico donde un usuario puede ver una lista de productos. Dividiremos el código en los componentes Modelo, Vista y Controlador.
Modelo (ProductModel.php)
<?php
class ProductModel {
private $products = [
["id" => 1, "name" => "Producto 1", "price" => 100],
["id" => 2, "name" => "Producto 2", "price" => 150],
["id" => 3, "name" => "Producto 3", "price" => 200],
];
public function getProducts() {
return $this->products;
}
}
?>
Vista (ProductView.php)
<?php
class ProductView {
public function render($products) {
echo "<h1>Lista de Productos</h1>";
echo "<ul>";
foreach ($products as $product) {
echo "<li>{$product['name']} - Precio: \${$product['price']}</li>";
}
echo "</ul>";
}
}
?>
Controlador (ProductController.php)
<?php
require_once 'ProductModel.php';
require_once 'ProductView.php';
class ProductController {
private $model;
private $view;
public function __construct() {
$this->model = new ProductModel();
$this->view = new ProductView();
}
public function showProducts() {
$products = $this->model->getProducts();
$this->view->render($products);
}
}
// Instanciamos el controlador y mostramos los productos
$controller = new ProductController();
$controller->showProducts();
?>
Archivo Principal (index.php)
<?php
require_once 'ProductController.php';
$controller = new ProductController();
$controller->showProducts();
?>
Modelo (ProductModel.php): Contiene un arreglo de productos y un método getProducts() que devuelve los productos.
Vista (ProductView.php): Recibe los datos y los muestra en un formato HTML.
Controlador (ProductController.php): Gestiona la lógica de la aplicación. Solicita los productos al modelo y pasa los datos a la vista para su representación.
Archivo Principal (index.php): Actúa como el punto de entrada para ejecutar la lógica del controlador y mostrar la vista.
Otro ejemplo un poco más profesional con conexión a bases de datos usando MVC lo pueden encontrar en mi repositorio: Ejemplo MVC Con Docker








Deja un comentario