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:
Estos patrones se centran en la forma en que se crean los objetos, ayudando a abstraer el proceso de instanciación.
Estos patrones se centran en cómo se componen las clases y los objetos para formar estructuras más grandes.
Estos patrones se centran en cómo los objetos interactúan y se comunican entre sí.
<?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
?>
<?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.