Шаблоны

Шаблоны - это способ описания лучших вариантов решения задач. Они дают гибкие решения общих задач программирования.

Factory

Шаблон Factory обеспечивает возможность создания экземпляра объекта во время выполнения. Он называется Factory Pattern ("Фабричный шаблон"), поскольку он отвечает за "изготовление" объекта. Метод Factory с параметрами получает в качестве аргумента имя класса для получения экземпляра класса.

Метод Factory с параметрами

<?php
class Example
{
// Метод Factory с параметрами
public static function factory($type)
{
if (include_once 'Drivers/' . $type . '.php') {
$classname = 'Driver_' . $type;
return new $classname;
} else {
throw new Exception ('Driver not found');
}
}
}
?>

Определение этого метода в классе позволяет загружать драйверы "на лету". Если класс Example является абстрактным классом базы данных, загрузка драйверов MySQL и SQLite может быть выполнена следующим образом:

<?php 
// Load a MySQL Driver
$mysql = Example::factory('MySQL');

// Load a SQLite Driver
$sqlite = Example::factory('SQLite');
?>

Singleton

Шаблон Singleton применяется в ситуациях, когда необходим единственный экземпляр класса. Самым распространенным примером этого может служить соединение с базой данных. Применение этого шаблона позволяет программисту сделать этот одиночный экземпляр легко доступным для многих других объектов.

Функция Singleton

<?php
class Example
{
// Hold an instance of the class
private static $instance;

// private конструктор; предотвращает прямое создание объекта
private function __construct()
{
echo 'I am constructed';
}

// Метод singleton
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}

return self::$instance;
}

// Метод Example
public function bark()
{
echo 'Woof!';
}

// Предотвращаем клонирование экземпляра пользователем
public function __clone()
{
trigger_error('Clone is not allowed.', E_USER_ERROR);
}

}

?>

Это позволяет восстановление единственного экземпляра класса Example

<?php 
// Это приведет к ошибке, потому что конструктор имеет статус private
$test = new Example;

// Это позволит восстановить единственный экземпляр класса$test = Example::singleton();
$test->bark();

// Это выдаст ошибку E_USER_ERROR.
$test_clone = clone($test);

?>