4.php 注册树模式

Register.php

<?php

namespace IMooc;

class Register
{
    protected static $objects;
    //set 表示将一个对象注册到全局的注册树上
    static function set($alias,$object)
    {
        self::$objects[$alias] = $object;
    }

    // _unset 表示将一个对象从注册树上移除,因为unset为php方法
    function _unset($alias)
    {
        unset(self::$objects[$alias]);
    }

    //取到我们放进去的对象
    static function get($name)
    {
        return self::$objects[$name];
    }
}

这里写图片描述
这里写图片描述


1. 什么是注册树模式

注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法。   
这让我想起了小时候买糖葫芦,卖糖葫芦的将糖葫芦插在一个大的杆子上,
人们买的时候就取下来。不同的是,注册树模式摘下来还会有,能摘很多次
,糖葫芦摘一次就没了。。。

2.为什么要采用注册树模式?

单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例
对象的方法。 那么注册树模式想解决什么问题呢? 
在考虑这个问题前,我们还是有必要考虑下前两种模式目前面临的局限。  
首先,单例模式创建唯一对象的过程本身还有一种判断,
即判断对象是否存在。存在则返回对象,不存在则创建对象并返回。
 每次创建实例对象都要存在这么一层判断。 
总的来说,单例模式和工厂模式可以产生更加合理的对象。
怎么方便调用这些对象呢?而且在项目内如此建立的对象好像
散兵游勇一样,不便统筹管理安排啊。因而,注册树模式应运而生。
不管你是通过单例模式还是工厂模式还是二者结合生成的对象,
都统统给我“插到”注册树上。我用某个对象的时候,
直接从注册树上取一下就好。这和我们使用全局变量一样的方便实用。 
而且注册树模式还为其他模式提供了一种非常好的想法。

3.如何实现注册树

通过上述的描述,我们似乎很容易就找到了解决方法。首先我们需要一个作为注册树的类,这毋庸置疑。
所有的对象“插入”到注册树上。这个注册树应该由一个静态变量来充当。
而且这个注册树应该是一个二维数组。这个类应该有一个
插入对象实例的方法(set()),当让相对应的就应该有一个
撤销对象实例的方法(_unset())。当然最重要的是还需
要有一个读取对象的方法(get())。拥有这些,我们就
可以愉快地完成注册树模式啦~~~
  下面让三种模式做个小小的结合。单纯创建一个实
  例对象远远没有这么复杂,但运用于大型项目的话,
  便利性便不言而喻了。
<?php
//创建单例
class Single{
 public $hash;
 static protected $ins=null;
 final protected function __construct(){
  $this->hash=rand(1,9999);
 }
 static public function getInstance(){
  if (self::$ins instanceof self) {
   return self::$ins;
  }
  self::$ins=new self();
  return self::$ins;
 } 
}
//工厂模式
class RandFactory{
 public static function factory(){
  return Single::getInstance();
 }
}
//注册树
class Register{
 protected static $objects;
 public static function set($alias,$object){
  self::$objects[$alias]=$object;
 }
 public static function get($alias){
  return self::$objects[$alias];
 }
 public static function _unset($alias){
  unset(self::$objects[$alias]);
 }
}
Register::set('rand',RandFactory::factory());
$object=Register::get('rand');
print_r($object);

http://www.jb51.net/article/71742.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值