单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
一个典型的php单例模式实现如下:
<?php
/**
* php singleton pattern
* @author newjueqi
* @modify 2011-12-30
* @website http://blog.youkuaiyun.com/newjueqi
*/
Class Test{
private function __construct(){}
private function __clone(){}
static private $_instance=NULL;
//get single object
public function getInstance(){
if( is_null( self::$_instance ) || !isset(self::$_instance) ){
self::$_instance=new Test();
}
return self::$_instance;
}
public function debug(){
echo "hello";
}
}
Test::getInstance()->debug();
Test::getInstance()->debug();
但这种方法有一个缺点,对于某个类,如果有时候我需要的是单个实例,有时候需要的是不同的实例,那怎么办呢?
对于以上的问题,在Magento中,由于Class Mage 是作用在整个request 过程,基于Mage的特点,Mage提供了两个static 方法: getModel() 和 getSingleton()
getModel():每次获取的是是不同的实例
getSingleton():每次获取的是是同一的实例
详细的代码如下:
/**
* Retrieve model object
*
* @link Mage_Core_Model_Config::getModelInstance
* @param string $modelClass
* @param array $arguments
* @return Mage_Core_Model_Abstract
*/
public static function getModel($modelClass = '', $arguments = array())
{
return self::getConfig()->getModelInstance($modelClass, $arguments);
}
/**
* Retrieve model object singleton
*
* @param string $modelClass
* @param array $arguments
* @return Mage_Core_Model_Abstract
*/
public static function getSingleton($modelClass='', array $arguments=array())
{
$registryKey = '_singleton/'.$modelClass;
//检测当前的对象是否已经存在,如果存在则取出来
if (!self::registry($registryKey)) {
//self::getModel的用途是实例化对象,然后把对象通过self::register()保存,
self::register($registryKey, self::getModel($modelClass, $arguments));
}
return self::registry($registryKey);
}
所以在一次请求过程中,每次使用Mage::getModel('XXX') 获得的都是不同的object,每次使用Mage::getSingleton('XXX') 获得的都是同一的object
[文章标题] magento中单例模式的变形实现
[文章作者]曾健生
[作者邮箱]zengjiansheng1@126.com
[作者QQ]190678908
[博客] http://blog.youkuaiyun.com/newjueqi