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 在线翻译函数代码
May 07 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
Jun 02 PHP
PHP删除数组中特定元素的两种方法
Jul 02 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
Aug 06 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
PHP版本如何选择?应该使用哪个版本?
May 13 PHP
带你了解PHP7 性能翻倍的关键
Nov 19 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
Mar 21 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
Mar 29 PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
Oct 23 PHP
Yii2框架控制器、路由、Url生成操作示例
May 27 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
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
2009/03/03 PHP
PHP答题类应用接口实例
2015/02/09 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
Jquery 一次处理多个ajax请求的代码
2011/09/02 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
JS判断文本框内容改变事件的简单实例
2014/03/07 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
Javascript堆排序算法详解
2014/12/03 Javascript
jquery实现九宫格大转盘抽奖
2015/11/13 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
react-native动态切换tab组件的方法
2018/07/07 Javascript
通过angular CDK实现页面元素拖放的步骤详解
2020/07/01 Javascript
python list使用示例 list中找连续的数字
2014/01/27 Python
Python中super的用法实例
2015/05/28 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
2019/08/02 Python
Python中os模块功能与用法详解
2020/02/26 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
python制作抽奖程序代码详解
2021/01/15 Python
CSS实现限制字数功能当对象内文本溢出时显示省略标记
2014/08/20 HTML / CSS
帕克纽约:PARKER NY
2018/12/09 全球购物
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
毕业生优秀推荐信
2013/11/26 职场文书
大三毕业自我鉴定
2014/01/15 职场文书
俞敏洪励志演讲稿
2014/04/29 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python
Python基础之常用库常用方法整理
2021/04/30 Python
利用Python第三方库实现预测NBA比赛结果
2021/06/21 Python
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技