PHP

Вариант реализации паттерна Registry или глобальная фабрика

Вот набросал вариант глобального реестра. Это стандартная реализация паттерна Registry в виде единственного экземпляра, но еще и с некоторыми фишками. Одна из них, если это можно назвать фишкой, - возможность обращения к защищенным свойствам из статических методов. Не знаю на сколько это круто, но меня почему-то пропёрло.

Думаю, неплохо получилось, так что комментировать мне уже нечего. Но вы можете это сделать в комментариях.



Listing №1 (PHP)
<?php
 
//интерфейс базы данных
interface Db {
  function foo();
}
 
//база данных
class RealDb implements Db {
 
  function foo()
  {
    echo 'real db';
  }
}
 
//фиктивная служба базы данных
class TestDb implements Db {
  function foo()
  {
    echo 'test db';
  }
}
 
//Реестр
class Registry {
 
  private static $_instance = null;
 
  protected $_db;
 
  public static function init($instance)
  {
    self::$_instance = new $instance();
    if (!self::$_instance instanceof Registry) {
      throw new Exception('');
    }
  }
 
  private static function getInstance()
  {
    if (!self::$_instance) {
      self::init('Registry');
    }
   
    return self::$_instance;
  }
 
  public static function getDb()
  {
    return self::getInstance()->_db;
  }
   
  protected function __construct() {
    $this->_db = new RealDb();
  }
 
  private function __clone() {}
}
 
//Реестр для тестирования
class TestRegistry extends Registry {
 
  protected function __construct() {
    $this->_db = new TestDb();
  }
}
 
////Пример
 
//Инициализация для тестирования
//Registry::init('TestRegistry');
 
$db = Registry::getDb();
$db->foo();


Раскомментируйте 72 строчку для инициализации другого варианта реестра. Можно заметить, что это похоже на глобальную фабрику.
Теги:
паттерны проектирования
Добавлено: 07 Августа 2018 21:51:19 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...