Шаблоны проектирования в PHP - паттерны
Шаблон проектирования или паттерн (англ. design pattern) - оптимальный и оригинальный подход в решении типичных, частовстречающихся задач. Эти подходы, приёмы имеют свои названия и используются почти во всех объектно-ориентированных языках программирования.
Паттерны можно классифицировать по назначению (цель, результат) и по тому, к чему обычно применяется к объектам или к классам.
- Поведенческие (behavioral)
- 2 - цепочка обязанностей (Chain of Responsibility);
- команда (Command);
- итератор (Iterator);
- посредник (Mediator);
- хранитель (Memento);
- наблюдатель (Observer);
- посетитель (Visitor);
- стратегия (Strategy);
- состояние (State);
- шаблонный метод (Template Method).
- Порождающие (creational)
- простая фабрика (Simple Factory);
- фабричный метод (Factory Method);
- абстрактная фабрика (Abstract Factory);
- строитель (Builder);
- прототип (Prototype);
- одиночка (Singleton).
- Структурные (structural)
- адаптер (Adapter);
- мост (Bridge);
- компоновщик (Composite);
- декоратор (Decorator);
- фасад (Facade);
- приспособленец (Flyweight);
- заместитель (Proxy).
Простая фабрика (Simple Factory);
<?php
interface Door
{
public function getWidth(): float;
public function getHeight(): float;
}
class WoodenDoor implements Door
{
protected $width;
protected $height;
public function __construct(float $width, float $height)
{
$this->width=$width;
$this->height=$height;
}
public function getWidth(): float
{
return $this->width;
}
public function getHeight(): float
{
return $this->height;
}
}
class DoorFactory
{
public static function makeDoor($width, $height): Door
{
return new WoodenDoor($width, $height);
}
}
$door=DoorFactory::makeDoor(100.5, 200.5);
echo 'Width: '.$door->getWidth()."<br>\n";
echo 'Height: '.$door->getHeight()."<br>\n";
?>
<?php
/*
ПАТТЕРН ФАБРИКА
В зависимости от роли, раздаём разные права
Из одного объекта класса Factory можно создать любое количество объектов
со свойствами и методами
*/
class Admin
{
protected $addPravo_1=true;
protected $addPravo_2=true;
}
class Moderator
{
protected $addPravo_1=false;
protected $addPravo_2=true;
}
class User
{
protected $addPravo_1=false;
protected $addPravo_2=false;
}
//Класс ФАБРИКА
class Factory
{
public static function creatUsers(string $role)
{
if (class_exists($role))
return new $role;
else
throw new exception('Нет такого класса '.$role);//Выкинуть ошибку
}
}
$role='Moderator';//Admin, Moderator или User
$login=Factory::creatUsers($role);
//$login=new $role;
var_dump($login);
?>
Фабричный метод (Fabric Method)
<?php
interface Interviewer
{
public function askQuestions();
}
class Developer implements Interviewer
{
public function askQuestions()
{
echo "Спрашивает про шаблоны проектирования!<br>\n";
}
}
class CommunityExecutive implements Interviewer
{
public function askQuestions()
{
echo "Спрашивает о работе с сообществом<br>\n";
}
}
abstract class HiringManager
{
//Фабричный метод
abstract public function makeInterviewer(): Interviewer;
public function takeInterview()
{
$interviewer = $this->makeInterviewer();
$interviewer->askQuestions();
}
}
class DevelopmentManager extends HiringManager
{
public function makeInterviewer(): Interviewer
{
return new Developer();
}
}
class MarketingManager extends HiringManager
{
public function makeInterviewer(): Interviewer
{
return new CommunityExecutive();
}
}
$devManager=new DevelopmentManager();
$devManager->takeInterview(); //Вывод: Спрашивает о шаблонах проектирования!
$marketingManager=new MarketingManager();
$marketingManager->takeInterview(); //Вывод: Спрашивает о работе с сообществом
?>

