Шаблоны проектирования в 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(); //Вывод: Спрашивает о работе с сообществом ?>