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