单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
一个典型的php单例模式实现如下:
<?php /** * php singleton pattern * @author newjueqi * @modify 2011-12-30 * @website http://blog.csdn.net/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); }
[文章标题] magento中单例模式的变形实现
[文章作者]曾健生
[作者邮箱][email protected]
[作者QQ]190678908
[博客] http://blog.csdn.net/newjueqi