PHP设计模式之注册树模式分析


Posted in PHP onJanuary 26, 2018

本文实例讲述了PHP注册树模式。分享给大家供大家参考,具体如下:

什么是注册树模式?

注册树模式当然也叫注册模式,注册器模式。之所以我在这里矫情一下它的名称,是因为我感觉注册树这个名称更容易让人理解。像前两篇一样,我们这 篇依旧是从名字入手。注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法。   这让我想起了小时候买糖葫芦,卖糖葫芦的将糖葫芦插在一个大的杆子上,人们买的时候就取下来。不同的是,注册树模式摘下来还会有,能摘很多次,糖葫芦摘一 次就没了。。。

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

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

如何实现注册树?

通过上述的描述,我们似乎很容易就找到了解决方法。首先我们需要一个作为注册树的类,这毋庸置疑。所有的对象“插入”到注册树上。这个注册树应 该由一个静态变量来充当。而且这个注册树应该是一个二维数组。这个类应该有一个插入对象实例的方法(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);

至此,三种模式设计介绍完毕。各种模式设计本身就会相辅相成,往后介绍其他模式的时候,多多少少会用到一种或多种其他设计模式。

一种模式不懂不要紧,相信编程的深入,定会产生恍然大悟的惊喜感 ,愿诸君与我共进步。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
编写漂亮的代码 - 将后台程序与前端程序分开
Apr 23 PHP
精美漂亮的php分页类代码
Apr 02 PHP
基于php socket(fsockopen)的应用实例分析
Jun 02 PHP
使用array mutisort 实现按某字段对数据排序
Jun 18 PHP
PHP批量检测并去除文件BOM头代码实例
May 08 PHP
PHP实现WebService的简单示例和实现步骤
Mar 27 PHP
PHP5.2下preg_replace函数的问题
May 08 PHP
thinkphp中字符截取函数msubstr()用法分析
Jan 09 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
Jul 18 PHP
PHP实现微信红包金额拆分试玩的算法示例
Apr 07 PHP
Laravel框架学习笔记之批量更新数据功能
May 30 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
Oct 23 PHP
PHP微信开发之微信录音临时转永久存储
Jan 26 #PHP
PHP CURL与java http使用方法详解
Jan 26 #PHP
php实现mysql连接池效果实现代码
Jan 25 #PHP
php使用imagecopymerge()函数创建半透明水印
Jan 25 #PHP
CI框架(CodeIgniter)操作redis的方法详解
Jan 25 #PHP
PHP开发之用微信远程遥控服务器
Jan 25 #PHP
php实现统计二进制中1的个数算法示例
Jan 23 #PHP
You might like
php数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
利用PHP命令行模式采集股票趋势信息
2016/08/09 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
基于json的jquery地区联动效果代码
2011/07/06 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
js获取当前时间显示在页面上并每秒刷新
2014/12/24 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
浅谈Vue.js路由管理器 Vue Router
2018/08/16 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
Node.js 进程平滑离场剖析小结
2019/01/24 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
python3库numpy数组属性的查看方法
2018/04/17 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
Python Opencv任意形状目标检测并绘制框图
2019/07/23 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
澳大利亚一站式数码相机商店:CameraPro
2020/03/09 全球购物
澳大利亚著名的纺织品品牌:Canningvale
2020/05/05 全球购物
师范大学毕业自我鉴定
2013/11/21 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
2014年新教师工作总结
2014/11/08 职场文书
2014年乡镇工作总结
2014/11/21 职场文书
2019入党申请书格式
2019/06/25 职场文书
python数据可视化使用pyfinance分析证券收益示例详解
2021/11/20 Python