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 相关文章推荐
php基础知识:控制结构
Dec 13 PHP
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
Feb 15 PHP
PHP入门学习笔记之一
Oct 12 PHP
PHP SPL使用方法和他的威力
Nov 12 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
Linux下php5.4启动脚本
Aug 03 PHP
重新认识php array_merge函数
Aug 31 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
Jan 07 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
Mar 20 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
Apr 21 PHP
PHP将整数数字转换为罗马数字实例分享
Mar 17 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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
关于firefox的ElementTraversal 接口 使用说明
2010/11/11 Javascript
js实现类似于add(1)(2)(3)调用方式的方法
2015/03/04 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
基于JavaScript代码实现pc与手机之间的跳转
2015/12/23 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
Angular.JS中指令ng-if的注意事项小结
2017/06/21 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
vue移动端监听滚动条高度的实现方法
2018/09/03 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
Python实现数据库编程方法详解
2015/06/09 Python
发布你的Python模块详解
2016/09/15 Python
python的pip安装以及使用教程
2018/09/18 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
keras输出预测值和真实值方式
2020/06/27 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
社会实践心得体会
2014/01/03 职场文书
加拿大探亲邀请信
2014/01/28 职场文书
庆元旦文艺演出主持词
2014/03/27 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
爱心募捐感谢信
2015/01/22 职场文书
离婚纠纷代理词
2015/05/23 职场文书
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android