Шаблон проектирования "Фабрика"(Pattern Factory).
Всем привет. Сегодня мы разберём третий важный шаблон проектирования "Фабрика" или Pattern Factory.
Его суть заключается в том, чтобы создавать объекты "на лету". Т.е. создавать их по ходу программы, если это нужно.
<?php
abstract class Renderer {
private $_document;
abstract function render();
function setDocument($document) {
$this->_document = $document;
}
}
class HTMLRenderer extends Renderer {
function render() {
//Выводим HTML
}
}
class XMLRenderer extends Renderer {
function render() {
//Выводим XML
}
}
//Создаём соответствующий тип класса Renderer
function RendererFactory() {
$accept = strtolower($_SERVER["HTTP_ACCEPT"]);
if(strpos($accept, "text/xml")>0) {
return new XMLRenderer();
}else{
return new HTMLRenderer();
}
}
$renderer = RendererFactory();
$renderer->setDocument("Some content...");
$renderer->render();
?>
У нас есть какой-то абстрактный класс, от которого наследуются другие классы: HTMLRenderer и XMLRenderer, а также есть функция RendererFactory, которая проверяет заголовок HTTP_ACCEPT и возвращает(!) нужный объект. Этот шаблон очень похож на стратегию, но разница в том, что в этом шаблоне мы возвращаем нужный нам объект. Наш класс вернёт нам объект в зависимости от того, какой заголовок. Если HTML, то HTMLRenderer, а если XML, то XMLRenderer. Можно так же создать, например, класс PDFRenderer, объект которого будет создан "на лету", если заголовок будет соответствующий.
Что ж, вы уже знаете 3 самых часто используемых шаблонов проектирования: singleton, factory и strategy и можете их использовать в своих проектах, а если вы не совсем понимаете, что же это и зачем нужно, то советую приобрести курс PHP и MySQL с Нуля до Гуру, где подробно рассмотрена тема объектно-ориентированного программирования, и создаётся движок с помощью данного подхода.
-
- Михаил Русаков
Комментарии (2):
Эмм... RendererFactory() - это функция, а вы пишете, что это должен быть класс.
Ответить
Спасибо! Исправлено
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.