📝 Patrones de diseño de software
← Volver

Los patrones de diseño se clasifican en tres categorías principales: patrones creacionales, patrones estructurales y patrones de comportamiento. Cada categoría aborda un aspecto específico de la construcción de software. Aquí hay una descripción general de algunos patrones comunes en cada categoría:

1. Patrones Creacionales

Estos patrones se centran en la forma en que se crean los objetos, ayudando a abstraer el proceso de instanciación.

2. Patrones Estructurales

Estos patrones se centran en cómo se componen las clases y los objetos para formar estructuras más grandes.

3. Patrones de Comportamiento

Estos patrones se centran en cómo los objetos interactúan y se comunican entre sí.

Ejemplos de Patrones de Diseño

Factory Method

<?php
interface Product {
    public function operation();
}

class ConcreteProductA implements Product {
    public function operation() {
        return "Result of ConcreteProductA";
    }
}

class ConcreteProductB implements Product {
    public function operation() {
        return "Result of ConcreteProductB";
    }
}

abstract class Creator {
    abstract public function factoryMethod(): Product;

    public function someOperation() {
        $product = $this->factoryMethod();
        return $product->operation();
    }
}

class ConcreteCreatorA extends Creator {
    public function factoryMethod(): Product {
        return new ConcreteProductA();
    }
}

class ConcreteCreatorB extends Creator {
    public function factoryMethod(): Product {
        return new ConcreteProductB();
    }
}

// Uso
$creatorA = new ConcreteCreatorA();
echo $creatorA->someOperation(); // Output: Result of ConcreteProductA

$creatorB = new ConcreteCreatorB();
echo $creatorB->someOperation(); // Output: Result of ConcreteProductB
?>

Observer

<?php
interface Observer {
    public function update($subject);
}

interface Subject {
    public function attach(Observer $observer);
    public function detach(Observer $observer);
    public function notify();
}

class ConcreteSubject implements Subject {
    private $observers = [];
    private $state;

    public function attach(Observer $observer) {
        $this->observers[] = $observer;
    }

    public function detach(Observer $observer) {
        $this->observers = array_filter($this->observers, function($obs) use ($observer) {
            return $obs !== $observer;
        });
    }

    public function notify() {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }

    public function getState() {
        return $this->state;
    }

    public function setState($state) {
        $this->state = $state;
        $this->notify();
    }
}

class ConcreteObserver implements Observer {
    public function update($subject) {
        echo "Observer: Reacted to the event. New state is " . $subject->getState() . "\n";
    }
}

// Uso
$subject = new ConcreteSubject();

$observer1 = new ConcreteObserver();
$observer2 = new ConcreteObserver();

$subject->attach($observer1);
$subject->attach($observer2);

$subject->setState(5); // Output: Observer: Reacted to the event. New state is 5
                       //         Observer: Reacted to the event. New state is 5
?>

Estos son solo algunos ejemplos de patrones de diseño. Cada patrón tiene su propio propósito y es útil en diferentes situaciones de diseño de software. Conocer y entender estos patrones puede ayudarte a escribir código más flexible, reutilizable y mantenible.