php 注册树(注册模式)

* 注册树:其实就是创建一个对象集,也叫对象池,是用数组来进行存储的
//先声明三个类,一会丢进对象树上中
class Demo1 {}

class Demo2 {}

class Demo3 {}
//声明对象注册树类
class Register
{
    //静态属性中保存着所有已经挂载到树上的对象

    public static $objs = [];

    //将对象挂载到树上

    public static function set($index,$obj)
    {
        self::$objs[$index] = $obj;
    }

    //取出对象使用
    public static function get($index)
    {
        return self::$objs[$index];
    }

    //已经无效的对象,及时销毁,节省资源

    public static function del($index)
    {
        unset(self::$objs[$index]);
    }
}

//先将三个类实例化后挂载到对象树上
Register::set('demo1',new Demo1);
Register::set('demo2',new Demo2);
Register::set('demo3',new Demo3);
//检测是否上树?
var_dump(Register::$objs);
echo '<hr>';
echo '<pre>'.print_r(Register::$objs,true).'</pre>';
echo '<hr>';
//用注册类的get方法查看
var_dump(Register::get('demo2'));
//删除对象池中的某个实例对象
Register::del('demo2');
//再次查看demo2对象,已经不能被查看了,因为被销毁了
var_dump(Register::get('demo2'));
<?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);

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

一、工厂设计模式
  index.php
  $db = IMoocFactory::createDatabase();
  使用工厂类的静态方法直接创建一个dababase对象,当类名发生修改时,在工厂里修改即可。
  IMooc/Factory.php
   
二、单例设计模式
  保证在整个脚本运行期间,只有一个对象的实例,比如数据库操纵对象
  Database.php


Factory.php
  index.php
  output同一个对象;
  object(IMoocDatabase)#1 (0) { }
  object(IMoocDatabase)#1 (0) { }
  object(IMoocDatabase)#1 (0) { }

三、注册树模式

  将对象注册到全局的注册树上,一般是在环境初始化时,将对象注册,在实现业务逻辑时,直接get获取即可;

  注册树类Register.php
  在工厂类里进行注册,将$db注册到$register注册树上
  在index.php中调用createDatabase进行注册
  output:object(IMoocDatabase)#1 (0) { }
原文地址:https://www.cnblogs.com/sgm4231/p/9849836.html