Паттерны ООП с примерами и описанием

Автор: Aport Суббота, Январь 31st, 2015 Нет комментариев

Рубрика: Язык PHP

Singleton (одиночка)

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

class Singleton
{
    private static $instance = null;

    private function __construct(){ /* ... @return Singleton */ }  // Защищаем от создания через new Singleton

    private function __clone()    { /* ... @return Singleton */ }  // Защищаем от создания через клонирование

    private function __wakeup()   { /* ... @return Singleton */ }  // Защищаем от создания через unserialize

    public static function getInstance() {
        if (is_null(self::$instance)) {
            self::$instance = new self;
        }
        return self::$instance;
    }
}

Registry (реестр, журнал записей)

Как следует из названия, данный паттерн предназначен для хранения записей которые в него помещают и соответственно возвращения этих записей (по имени) если они потребуются. В примере с телефонной станцией, она является реестром по отношению к телефонным номерам жителей.

class Registry
{
    private $registry = array();

    public function set($key, $object) {
        $this->registry[$key] = $object;
    }

    public function get($key) {
        return $this->registry[$key];
    }
}

Singleton Registry (одинокий реестр)

«Реестр» нередко является «одиночкой», однако это не всегда должно быть именно так. Например мы можем заводить в бухгалтерии несколько журналов, в одном работники от «А» до «М», в другом от «Н» до «Я». Каждый такой журнал будет «реестром», но не «одиночкой», потому как журналов уже 2.

class Multiton
{
    private static $instance = null;

    private $registry = array();

    private function __construct(){ /* ... @return Singleton */ }  // Защищаем от создания через new Singleton

    private function __clone()    { /* ... @return Singleton */ }  // Защищаем от создания через клонирование

    private function __wakeup()   { /* ... @return Singleton */ }  // Защищаем от создания через unserialize

    public static function getInstance() {
        if (is_null(self::$instance)) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function set($key, $object) {
        $this->registry[$key] = $object;
    }

    public function get($key) {
        return $this->registry[$key];
    }
}

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

Multiton (пул «одиночек») или другими словами Registry Singleton (реестр одиночек)

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

class Database
{
    private static $instances = array();

    private function __construct() { }
    private function __clone() { }

    public static function getInstance($key) {

        if(!array_key_exists($key, self::$instances)) {
            self::$instances[$key] = new self();
        }
        return self::$instances[$key];
    }
}

$master = Database::getInstance('master');
var_dump($master); // object(Database)#1 (0) { }

$logger = Database::getInstance('logger');
var_dump($logger); // object(Database)#2 (0) { }

$masterDupe = Database::getInstance('master');
var_dump($masterDupe); // object(Database)#1 (0) { }

// Fatal error: Call to private Database::__construct() from invalid context
$dbFatalError = new Database();

// PHP Fatal error:  Call to private Database::__clone()
$dbCloneError = clone $masterDupe;

Object pool (пул объектов)

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

 

Источник: yapro.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты