• 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) { }
  • 相关阅读:
    Markdown基本语法
    Linux之更好的使用Bash
    博客园-使用的模板
    井字棋的最优策略竟是先占角!
    Highcharts入门+Highcharts基础教程,【非常值得学习的资料】
    Python4周 入职培训的过程
    Linux系统入门学习:在CentOS上安装phpMyAdmin
    WeCenter程序安装
    js正则表达式语法
    Sublime text2如何设置快捷键让编写的HTML文件在浏览器预览?
  • 原文地址:https://www.cnblogs.com/sgm4231/p/9849836.html
Copyright © 2020-2023  润新知