设计模式之Singleton

           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]);
    }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值