magento中单例模式的变形实现

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

一个典型的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);
    }

所以在一次请求过程中,每次使用Mage::getModel('XXX') 获得的都是不同的object,每次使用Mage::getSingleton('XXX') 获得的都是同一的object

[文章标题] magento中单例模式的变形实现

[文章作者]曾健生

[作者邮箱]zengjiansheng1@126.com

[作者QQ]190678908

[博客]  http://blog.csdn.net/newjueqi
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

newjueqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值