Singleton(译为单件或单态)模式是设计模式中比较简单而常用的模式。
有些时候在整个应用程序中,会要求某个类有且只有一个实例,这个时候可以采用Singleton模式进行设计。用Singleton模式设计的类不仅能保证在应用中只有一个实例,而且提供了一种非全局变量的方法进行全局访问,称为全局访问点,这样对于没有全局变量概念的纯面向对象语言来说是非常方便的,比如C#。
FleaPHP的代码片段
/**
* 返回指定对象的唯一实例
*
* @param string $className
*
* @return object
*/
function & getSingleton($className)
{
static $instances = array();
if (FLEA::isRegistered($className)) {
// 返回已经存在的对象实例
return FLEA::registry($className);
}
if (!class_exists($className)) {
if (!FLEA::loadClass($className)) {
$return = false;
return $return;
}
}
$instances[$className] =& new $className();
FLEA::register($instances[$className], $className);
return $instances[$className];
}
/**
* 将一个对象实例注册到对象实例容器
*
* @param object $obj
* @param string $name
*
* @return object
*/
function & register(& $obj, $name = null)
{
if (!is_object($obj)) {
FLEA::loadClass('FLEA_Exception_TypeMismatch');
__THROW(new FLEA_Exception_TypeMismatch($obj, 'object', gettype($obj)));
$return = false;
return $return;
}
if (is_null($name)) {
$name = get_class($obj);
}
if (isset($GLOBALS[G_FLEA_VAR]['OBJECTS'][$name])) {
FLEA::loadClass('FLEA_Exception_ExistsKeyName');
__THROW(new FLEA_Exception_ExistsKeyName($name));
$return = false;
return $return;
} else {
$GLOBALS[G_FLEA_VAR]['OBJECTS'][$name] =& $obj;
return $obj;
}
}
/**
* 从对象实例容其中取出指定名字的对象实例,如果没有指定名字则返回包含所有对象的数组
*
* @param string $name
*
* @return object
*/
function & registry($name = null)
{
if (is_null($name)) {
return $GLOBALS[G_FLEA_VAR]['OBJECTS'];
}
if (isset($GLOBALS[G_FLEA_VAR]['OBJECTS'][$name])) {
return $GLOBALS[G_FLEA_VAR]['OBJECTS'][$name];
}
FLEA::loadClass('FLEA_Exception_NotExistsKeyName');
__THROW(new FLEA_Exception_NotExistsKeyName($name));
$return = false;
return $return;
}
/**
* 检查指定名字的对象是否已经注册
*
* @param string $name
*
* @return boolean
*/
function isRegistered($name)
{
return isset($GLOBALS[G_FLEA_VAR]['OBJECTS'][$name]);
}