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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(2)
Oct 09 PHP
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
Mar 29 PHP
PHP 危险函数解释 分析
Apr 22 PHP
Ajax+PHP边学边练 之五 图片处理
Dec 03 PHP
php学习之 循环结构实现代码
Jun 09 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
Aug 23 PHP
PHP判断远程url是否有效的几种方法小结
Oct 08 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
Dec 14 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
Sep 25 PHP
thinkphp3.x中变量的获取和过滤方法详解
May 20 PHP
CodeIgniter集成smarty的方法详解
May 26 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
JCalendar 日历控件 v1.0 beta[兼容IE&amp;Firefox] 有文档和例子
2007/05/30 Javascript
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
javascript date格式化示例
2013/09/25 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
2015/04/02 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
mongoose设置unique不生效问题的解决及如何移除unique的限制
2017/11/07 Javascript
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
Linux 修改Python命令的方法示例
2018/12/03 Python
让你Python到很爽的加速递归函数的装饰器
2019/05/26 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
pycharm + django跨域无提示的解决方法
2020/12/06 Python
python中delattr删除对象方法的代码分析
2020/12/15 Python
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
入党思想汇报
2014/01/05 职场文书
个人求职信范文分享
2014/01/31 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
运动会1000米加油稿
2015/07/21 职场文书
会计岗位工作总结
2015/08/12 职场文书
Python进行区间取值案例讲解
2021/08/02 Python
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript
Win11 22H2 2022怎么更新? 获得Win1122H22022版本升级技巧
2022/09/23 数码科技