Шаблоны - это способ описания оптимальных методов и хороших дизайнов проектирования. Они предоставляют универсальные пути решения общих проблем программирования.
Шаблон Фабрика позволяет создавать объекты во время работы программы. Этот шаблон называется Фабрикой потому, что он отвечает за производство объекта. Параметризированная фабрика принимает в качестве аргумента имя класса, объект которого создается.
Пример #1 Параметризированный фабричный метод
<?php
class Example
{
// Параметризированный фабричный метод
public static function factory($type)
{
if (include_once 'Drivers/' . $type . '.php') {
$classname = 'Driver_' . $type;
return new $classname;
} else {
throw new Exception ('Драйвер не найден');
}
}
}
?>
Определение этого метода в классе позволяет драйверам быть загруженными "на лету". В случае, если класс Example был бы классом абстрактного доступа к базе данных, то загрузка драйвера MySQL и SQLite может быть выполнена следующим образом:
<?php
// Загрузка драйвера MySQL
$mysql = Example::factory('MySQL');
// Загрузка драйвера SQLite
$sqlite = Example::factory('SQLite');
?>
Шаблон проектирования Синглтон применяется в тех ситуациях, когда нужно получить единственный экземпляр класса. Большинство примеров, связанных с этим - это взаимодействие с базой данных. Реализация этого шаблона позволяют программисту создать единственный экземпляр класса, к которому будут иметь доступ остальные объекты.
Пример #2 Функция Синглтон
<?php
class Example
{
// Содержит экземпляр класса
private static $instance;
// Закрытый конструктор; предотвращает прямой доступ к
// созданию объекта
private function __construct()
{
echo 'Я конструктор';
}
// Метод синглтон
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
// Метод для примера
public function bark()
{
echo 'Гав!';
}
// Предотвращает клонирование экземпляра класса
public function __clone()
{
trigger_error('Клонирование запрещено.', E_USER_ERROR);
}
}
?>
Позволяет вернуть единственный экземпляр класса Example
<?php
// Такой вариант завершится неудачей, так как конструктор
// объявлен как private
$test = new Example;
// Это всегда возвращает единственный экземпляр класса
$test = Example::singleton();
$test->bark();
// Это вызовет ошибку E_USER_ERROR.
$test_clone = clone $test;
?>