• Главная
  • Карта сайта
Не найдено

Шаблоны проектирования в PHP

Опубликовано: 01.09.2018

видео Шаблоны проектирования в PHP

Шаблоны проектирования PHP

Сейчас мы поговорим о шаблонах проектирования, а если точнее, то о шаблонах проектирования интернет-приложений на PHP. Профессиональные разработчики вряд ли узнают что-то новое, но для новичков данная статья будет очень полезна.



Что такое шаблоны проектирования?

Это вовсе не аналитические шаблоны, не описание стандартных структур информации вроде связных перечней. Также это не правила, по которым строятся определенные интерфейсы и приложения.

Шаблоны проектирование - это:

фактически является «описанием взаимодействия классов и объектов, построенным для решения типичных задач проектирования в конкретном контексте». Иными словами, шаблоны проектирования предоставляют весь набор подходов к решению различных каждодневных проблем. не класс или библиотека, которые можно бы было просто включить в имеющуюся систему, это не определенный алгоритм, который можно бы было преобразовать в код. что-то большее, они описывают способы, посредством которых может быть спроектирована любая программная система, которая решает проблему конкретного рода. значительно ускоряют разработку приложений, так как собой представляют проверенные практикой решения, которые нужно лишь воплотить в определенной архитектуре. Кроме того, шаблоны проектирования очень упрощают понимание достаточно сложных концепций.

Разумеется, следует в выборе шаблона проектирования для решения каждой определенной проблемы проявлять осмотрительность.


PHP Start | Теория: Урок 17. Шаблоны проектирования, стандарты кодирования

«Каждый из шаблонов описывает одну из тех проблем, возникающих раз за разом. И потом описывает основу решения данной проблемы так, что вы можете воплотить такое решение во множестве программ, при этом ни разу не повторившись.», К. Александер.


35 - Уроки PHP. Шаблон проектирования Factory

Виды шаблонов проектирования

В настоящее время существует 23 шаблона проектирования, в соответствии с их назначением они разделены на три группы:

порождающие шаблоны: применяются для создания объектов, которые потом могут использоваться независимо от системы, создавшей их: Абстрактная фабрика (имена производимых объектов). Строитель (соотношение элементов сложных объектов). Фабричный метод (подкласс создаваемых объектов). Прототип (класс создаваемых объектов). Одиночка (класс имеет единственную инстанцию). структурные шаблоны: объединяют в одну логическую структуру объекты, несвязанные друг с другом: Адаптер (интерфейс к объекту). Мост (реализация объекта). Компоновщик (структура и соотношение элементов объекта). Декоратор (ответственность объекта такого же класса). Фасад (интерфейс к подсистеме объекта). Приспособленец (подсистема хранения объекта). Заместитель (способ и место обращения к объекту). поведенческие шаблоны: управляют отношениями, алгоритмами и распределением обязанностей между различными программными объектами: Посетитель (операции, которые осуществляются с объектом, без изменения его класса). Хранитель (какие частные данные класса хранятся вне его, и когда). Шаблонный метод (последовательность действий). Стратегия (выбор алгоритма). Состояние (состояние объектов). Наблюдатель (число зависимых объектов и метод обновления их состояния). Посредник (порядок и доступ взаимодействия объектов друг с другом). Интератор (порядок доступа к вложенным частям). Цепочка ответственности (выбор объекта, который способен выполнить этот запрос). Команда (способ и время выполнения запроса).

Основные шаблоны проектирования в php

А теперь мы расскажем вам подробнее о наиболее востребованных из вышеперечисленных шаблонов.

Одиночка

<?php final class Product { private static $instance; public $mix; public static function getInstance() { if (!(self::$instance instanceof self)) { self::$instance = new self(); } return self::$instance; } private function __construct() { } private function __clone() { } } $firstProduct = Product::getInstance(); $secondProduct = Product::getInstance(); $firstProduct->mix = 'test'; $secondProduct->mix = 'example'; print_r($firstProduct->mix); print_r($secondProduct->mix);

Пул одиночек

В определенном случае может потребоваться обеспечить доступ к паре одиночек в одном проекте.

<?php abstract class FactoryAbstract { protected static $instances = array(); public static function getInstance() { $className = static::getClassName(); if (!(self::$instances[$className] instanceof $className)) { self::$instances[$className] = new $className(); } return self::$instances[$className]; } public static function removeInstance() { $className = static::getClassName(); if (array_key_exists($className, self::$instances)) { unset(self::$instances[$className]); } } final protected static function getClassName() { return get_called_class(); } protected function __construct() { } final protected function __clone() { } } abstract class Factory extends FactoryAbstract { final public static function getInstance() { return parent::getInstance(); } final public static function removeInstance() { parent::removeInstance(); } } // Использование: class FirstProduct extends Factory { public $a = []; } class SecondProduct extends FirstProduct { } FirstProduct::getInstance()->a[] = 1; SecondProduct::getInstance()->a[] = 2; FirstProduct::getInstance()->a[] = 3; SecondProduct::getInstance()->a[] = 4; print_r(FirstProduct::getInstance()->a); // array(1, 3) print_r(SecondProduct::getInstance()->a); // array(2, 4)

Стратегия

Реализуя этот шаблон, вы инкапсулируете какую-то группу алгоритмов таким образом, чтобы порожденный класс мог воспользоваться ими, при этом ничего не зная об их конкретной реализации.

<?php interface OutputInterface { public function load(); } class SerializedArrayOutput implements OutputInterface { public function load() { return serialize($arrayOfData); } } class JsonStringOutput implements OutputInterface { public function load() { return json_encode($arrayOfData); } } class ArrayOutput implements OutputInterface { public function load() { return $arrayOfData; } }

Декоратор

Данный шаблон подразумевает внедрение совсем нового поведения в объект в момент выполнения программы.

<?php class HtmlTemplate { // методы родительского класса } class Template1 extends HtmlTemplate { protected $_html; public function __construct() { $this->_html = "

__text__"; } public function set($html) { $this->_html = $html; } public function render() { echo $this->_html; } } class Template2 extends HtmlTemplate { protected $_element; public function __construct($s) { $this->_element = $s; $this->set("

" . $this->_html . "

"); } public function __call($name, $args) { $this->_element->$name($args[0]); } } class Template3 extends HtmlTemplate { protected $_element; public function __construct($s) { $this->_element = $s; $this->set("" . $this->_html . ""); } public function __call($name, $args) { $this->_element->$name($args[0]); } }

Фабрика

Это еще один очень популярный шаблон. Он производит инстанции объектов.

Иными словами, представьте ситуацию, что у вас есть реальная фабрика, которая производит какое-то изделие. Мы можем не иметь понятия, как фабрика производит данное изделие, но у нас есть универсальный метод его заказать.

<?php interface Factory { public function getProduct(); } interface Product { public function getName(); } class FirstFactory implements Factory { public function getProduct() { return new FirstProduct(); } } class SecondFactory implements Factory { public function getProduct() { return new SecondProduct(); } } class FirstProduct implements Product { public function getName() { return 'The first product'; } } class SecondProduct implements Product { public function getName() { return 'Second product'; } } $factory = new FirstFactory(); $firstProduct = $factory->getProduct(); $factory = new SecondFactory(); $secondProduct = $factory->getProduct(); print_r($firstProduct->getName()); // первый продукст print_r($secondProduct->getName()); // второй продукт

Абстрактная фабрика

Бывает так, что когда у нас есть несколько похожих фабрик, и нам необходимо скрыть всю логику выбора фабрики для каждого определенного запроса. Здесь нам поможет именно этот шаблон.

<?php class Config { public static $factory = 1; } interface Product { public function getName(); } abstract class AbstractFactory { public static function getFactory() { switch (Config::$factory) { case 1: return new FirstFactory(); case 2: return new SecondFactory(); } throw new Exception('Bad config'); } abstract public function getProduct(); } class FirstFactory extends AbstractFactory { public function getProduct() { return new FirstProduct(); } } class FirstProduct implements Product { public function getName() { return 'The product from the first factory'; } } class SecondFactory extends AbstractFactory { public function getProduct() { return new SecondProduct(); } } class SecondProduct implements Product { public function getName() { return 'The product from second factory'; } } $firstProduct = AbstractFactory::getFactory()->getProduct(); Config::$factory = 2; $secondProduct = AbstractFactory::getFactory()->getProduct(); print_r($firstProduct->getName()); // Первый продукт из первой фабрики print_r($secondProduct->getName()); // Второй продукт из второй фабрики

Наблюдатель

«Наблюдатель» – шаблон, который предусматривает для наблюдаемого объекта полную возможность зарегистрировать наблюдателя, когда тот вызовет особый метод.

Затем, если состояние наблюдаемого объекта будет меняться, он посылает об этом сообщение своим наблюдателям.

<?php interface Observer { function onChanged($sender, $args); } interface Observable { function addObserver($observer); } class CustomerList implements Observable { private $_observers = array(); public function addCustomer($name) { foreach($this->_observers as $obs) $obs->onChanged($this, $name); } public function addObserver($observer) { $this->_observers []= $observer; } } class CustomerListLogger implements Observer { public function onChanged($sender, $args) { echo( "'$args' Customer has been added to the list \n" ); } } $ul = new UserList(); $ul->addObserver( new CustomerListLogger() ); $ul->addCustomer( "Jack" );
Новости
Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью

rss