Design patterns
многотонные
Поиск…
замечания
Multitonitis
То же, что и Singleton , Multiton можно считать плохой практикой. Однако есть моменты, когда вы можете использовать его с умом (например, если вы создаете систему, такую как ORM / ODM, чтобы сохранить несколько объектов).
Пул синглтонов (пример PHP)
Multiton можно использовать в качестве контейнера для однотонных. Это реализация Multiton представляет собой комбинацию шаблонов Singleton и Pool.
Это пример того, как можно создать общий абстрактный класс пулов Multiton:
abstract class MultitonPoolAbstract
{
/**
* @var array
*/
protected static $instances = [];
final protected function __construct() {}
/**
* Get class name of lately binded class
*
* @return string
*/
final protected static function getClassName()
{
return get_called_class();
}
/**
* Instantiates a calling class object
*
* @return static
*/
public static function getInstance()
{
$className = static::getClassName();
if( !isset(self::$instances[$className]) ) {
self::$instances[$className] = new $className;
}
return self::$instances[$className];
}
/**
* Deletes a calling class object
*
* @return void
*/
public static function deleteInstance()
{
$className = static::getClassName();
if( isset(self::$instances[$className]) )
unset(self::$instances[$className]);
}
/*-------------------------------------------------------------------------
| Seal methods that can instantiate the class
|------------------------------------------------------------------------*/
final protected function __clone() {}
final protected function __sleep() {}
final protected function __wakeup() {}
}
Таким образом, мы можем создавать различные пулы Singleton.
Реестр синглтонов (пример PHP)
Этот шаблон можно использовать для хранения зарегистрированных пулов синглтонов, каждый из которых отличается уникальным идентификатором:
abstract class MultitonRegistryAbstract
{
/**
* @var array
*/
protected static $instances = [];
/**
* @param string $id
*/
final protected function __construct($id) {}
/**
* Get class name of lately binded class
*
* @return string
*/
final protected static function getClassName()
{
return get_called_class();
}
/**
* Instantiates a calling class object
*
* @return static
*/
public static function getInstance($id)
{
$className = static::getClassName();
if( !isset(self::$instances[$className]) ) {
self::$instances[$className] = [$id => new $className($id)];
} else {
if( !isset(self::$instances[$className][$id]) ) {
self::$instances[$className][$id] = new $className($id);
}
}
return self::$instances[$className][$id];
}
/**
* Deletes a calling class object
*
* @return void
*/
public static function unsetInstance($id)
{
$className = static::getClassName();
if( isset(self::$instances[$className]) ) {
if( isset(self::$instances[$className][$id]) ) {
unset(self::$instances[$className][$id]);
}
if( empty(self::$instances[$className]) ) {
unset(self::$instances[$className]);
}
}
}
/*-------------------------------------------------------------------------
| Seal methods that can instantiate the class
|------------------------------------------------------------------------*/
final protected function __clone() {}
final protected function __sleep() {}
final protected function __wakeup() {}
}
Это упрощенная форма шаблона, которая может использоваться для ORM для хранения нескольких объектов определенного типа.