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 相关文章推荐
基于qmail的完整WEBMAIL解决方案安装详解
Oct 09 PHP
Windows2003 下 MySQL 数据库每天自动备份
Dec 21 PHP
用header 发送cookie的php代码
Mar 16 PHP
一些被忽视的PHP函数(简单整理)
Apr 30 PHP
改写函数实现PHP二维/三维数组转字符串
Sep 13 PHP
php上传中文文件名乱码问题处理方案
Feb 03 PHP
php接口技术实例详解
Dec 07 PHP
Eclipse PHPEclipse 配置的具体步骤
Aug 08 PHP
如何优雅的使用 laravel 的 validator验证方法
Nov 11 PHP
Laravel5.7框架安装与使用学习笔记图文详解
Apr 02 PHP
PHP实现文件上传操作和封装
Mar 04 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 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 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
php车辆违章查询数据示例
2016/10/14 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
刷新页面实现方式总结(HTML,ASP,JS)
2008/11/13 Javascript
JQuery 写的个性导航菜单
2009/12/24 Javascript
JQuery中的$.getJSON 使用说明
2011/03/10 Javascript
使用jQuery重置(reset)表单的方法
2014/05/05 Javascript
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
2018/09/03 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
Vue+tracking.js 实现前端人脸检测功能
2020/04/16 Javascript
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
[01:14:31]Secret vs VG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
python__name__原理及用法详解
2019/11/02 Python
python判断元素是否存在的实例方法
2020/09/24 Python
Python 随机按键模拟2小时
2020/12/30 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
中医药大学毕业生自荐信
2013/11/08 职场文书
18岁生日感言
2014/01/12 职场文书
公益广告语集锦
2014/03/13 职场文书
社区清明节活动总结
2014/07/04 职场文书
体育教师个人总结
2015/02/09 职场文书
2015年班长个人工作总结
2015/04/03 职场文书
Mysql 用户权限管理实现
2021/05/25 MySQL