zoukankan      html  css  js  c++  java
  • php设计模式-注册树模式

    php注册树模式

    1、什么是注册树模式?

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

    2、为什么要用工厂模式?

    前面讲到的单例模式解决了在整个项目中创建唯一对象的问题,

    工厂模式解决了不通过new解决实例对象的问题,考虑的是项目扩展与维护。

    总得来说单例模式和工厂模式可以产生更加合理的对象,

    那么怎么方便统筹调用这些对象呢,这时候就用到了注册树模式,不管你是单例模式,工厂模式还是二者结合生成的对象,都统统给我注册到树上,用某个对象的时候,直接从树上取下来就好

    3、如何实现注册树

    我们用“四个一”来记

    • 一个静态变量,用于将所有的对象“插入”到注册树上,而且这个注册树应该是一个二维数组。
    • 一个插入对象实例的方法set()),
    • 一个撤销对象实例的方法_unset())。
    • 一个读取对象的方法get())。

    拥有这些,我们就可以愉快地完成注册树模式啦~~~

    4、代码示例

    /**
     * @purpose: 创建一个单例类
     * Class Single
     */
    class Single {
        /**
         * @var Object 保存类实例的静态成员变量
         */
        private static $_instance;
    
        /**
         * Single constructor. 私有的构造方法
         */
        private function __construct(){
            echo 'This is a Constructed method;';
        }
    
        /**
         * @purpose: 创建__clone方法防止对象被复制克隆
         */
        public function __clone(){
            trigger_error('Clone is not allow!',E_USER_ERROR);
        }
    
        /**
         * @return Single|Object 单例方法,用于访问实例的公共的静态方法
         */
        public static function getInstance(){
            if(!(self::$_instance instanceof self)){
                self::$_instance = new self;
            }
            return self::$_instance;
        }
    
    }
    
    /**
     * @purpose: 创建一个工厂类
     * Class mysqlFactory
     */
    class MysqlFactory{
    
        static public function factory($className){
            return new $className();
        }
    
    }
    
    interface  Mysql{
    
        public function connect();
    }
    
    class Mysqli  implements mysql{
    
        public  function connect(){
            echo 'mysqli';
        }
    }
    
    class Pdo implements mysql{
    
        public function connect(){
            echo 'pdo';
        }
    }
    
    /**
     * @purpose: 创建一个注册树模式
     * Class Register
     */
    class Register
    {
        /**
         * @var array 将所有的对象“插入”到注册树上
         */
        static protected $objects;
    
        /**
         * 插入对象实例
         * @param string $alias
         * @param object $object 对象实例
         */
        public static function set($alias,$object)
        {
            self::$objects[$alias]=$object;
        }
    
        /**
         * 撤销对象实例
         * @param string $alias
         */
        public static function _unset($alias)
        {
            unset(self::$objects[$alias]);
        }
    
        /**
         * 获取对象实例
         * @param string $alias
         * return object
         */
        public static function get($alias)
        {
            return self::$objects[$alias];
        }
    }
    
    //将工厂和单例生成的数据库对象注册到“注册树”上
    Register::set('signal',MysqlFactory::factory('Pdo'));
    $signal=Register::get('signal');
    $signal->connect();

    本文为参考博友博客后编写,感谢博友:https://www.cnblogs.com/freelyflying/p/7019243.html

    如有转载请注明出处:https://www.cnblogs.com/chrdai/p/11182796.html

  • 相关阅读:
    python机器学习系列之环境搭建
    github 出现 Permission denied (publickey)的解决
    Eclipse添加Web和java EE插件
    GNU Make 学习系列一:怎样写一个简单的Makefile
    GTK+编程概述
    SpringBoot导出excel数据报错Could not find acceptable representation
    Postman测试上传MultipartFile文件
    idea 代码没有被svn控制
    FPGA基础学习(1) -- FFT IP核(Quartus)
    markdown使用小结
  • 原文地址:https://www.cnblogs.com/chrdai/p/11182796.html
Copyright © 2011-2022 走看看