<?php
class Singleton {
private static $instance;
private function __construct() {}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
interface Product {
public function getName();
}
class ConcreteProductA implements Product {
public function getName() {
return 'Concrete Product A';
}
}
class ConcreteProductB implements Product {
public function getName() {
return 'Concrete Product B';
}
}
class Factory {
public static function createProduct($type) {
switch ($type) {
case 'A':
return new ConcreteProductA();
case 'B':
return new ConcreteProductB();
default:
throw new Exception('Invalid product type.');
}
}
}
interface Target {
public function request();
}
class Adaptee {
public function specificRequest() {
echo 'Specific request.';
}
}
class Adapter implements Target {
private $adaptee;
public function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
public function request() {
$this->adaptee->specificRequest();
}
}
interface Component {
public function operation();
}
class ConcreteComponent implements Component {
public function operation() {
echo 'Concrete operation.';
}
}
class Decorator implements Component {
private $component;
public function __construct(Component $component) {
$this->component = $component;
}
public function operation() {
echo 'Decorator operation (before).';
$this->component->operation();
echo 'Decorator operation (after).';
}
}
interface Observer {
public function update();
}
class ConcreteObserver implements Observer {
public function update() {
echo 'Observer update.';
}
}
class Subject {
private $observers = [];
public function attach(Observer $observer) {
$this->observers[] = $observer;
}
public function detach(Observer $observer) {
$index = array_search($observer, $this->observers);
if ($index !== false) {
array_splice($this->observers, $index, 1);
}
}
public function notify() {
foreach ($this->observers as $observer) {
$observer->update();
}
}
}
$singleton = Singleton::getInstance();
$productA = Factory::createProduct('A');
$productB = Factory::createProduct('B');
echo $productA->getName();
echo $productB->getName();
$adaptee = new Adaptee();
$adapter = new Adapter($adaptee);
$adapter->request();
$component = new ConcreteComponent();
$decorator = new Decorator($component);
$decorator->operation();
$observer = new ConcreteObserver();
$subject = new Subject();
$subject->attach($observer);
$subject->notify();
?>