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

news/2024/11/16 21:00:57/

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

什么是注册树模式?

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

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

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

如何实现注册树?

通过上述的描述,我们似乎很容易就找到了解决方法。首先我们需要一个作为注册树的类,这毋庸置疑。所有的对象“插入”到注册树上。这个注册树应 该由一个静态变量来充当。而且这个注册树应该是一个二维数组。这个类应该有一个插入对象实例的方法(set()),当让相对应的就应该有一个撤销对象实例 的方法(_unset())。当然最重要的是还需要有一个读取对象的方法(get())。拥有这些,我们就可以愉快地完成注册树模式啦~~~

下面让三种模式做个小小的结合。单纯创建一个实例对象远远没有这么复杂,但运用于大型项目的话,便利性便不言而喻了。

//创建单例

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程序设计有所帮助。


http://www.ppmy.cn/news/773324.html

相关文章

java注册页面模板_Servlet编写注册登录页面

新建一个servlet项目 Flies --> new --> project-->ProjectSDK选择自己的JDK文件-->勾选Web Appliction -->Next 项目构造如下: 设置项目配置 File --> Project Structure (快捷键:Ctrl + Shift + Alt + S) --> 选择Module :

uniapp请求封装

这里就简单记录一下吧,也做了挺长时间uniapp了,希望下次换个项目做的时候,能直接从这里拷过去用 大家都知道再uniapp中给我们提供的uni.request()来供我们发请求使用,它里面有 success、fail、complete三个回调函数,如…

Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素

目录 345. 反转字符串中的元音字母 Reverse Vowels Of A String 🌟  347. 前 K 个高频元素 Top-k Frequent Elements 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专…

服务器主板选哪个型号好,服务器主板这两个哪个好?

”相关问题,库巴帮助小助手为您解答。华硕DSBF-DE/SAS服务器主板支持英特尔双核至强5000/5100系列和英特尔四核至强5300/5400系列处理器,用户可根据自身需求进行选用。由于采用了英特尔5000PMCH和6321ESBICH芯片组,该主板具有更高的前端总线1…

linux中的数据库

目录 1.安装MySQL 2.创建数据库 3.删除数据库 4.查询创建数据库的语句 5使用数据库的语句 6.查询当前默认的数据库 7.查询使用的编码方式和校验规则 8.创建表的语句 9.表的物理存储结构 10.表的数据类型 11.总结 引言: 数据库是现代应用开发中不可或缺的组…

Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling

感想:由于看不懂官方代码的原因,自己这方面耽误了一段时间,一方面,在AI与经济学之间犹豫了许久,另一方面,工作 了半年,也没发工资,没空找培训代码的课程,所以停止更新了三…

4am永远 鼠标按键设置_罗技新版G102游戏鼠标开箱:8000DPI、119元到手体验如何?...

今天周末,恰好之前预定的一款新鼠标到了,所以就趁着这机会简单开箱秀一下。这款鼠标在上市之前还挺有名气的,它就是罗技推出的新版G102。这款鼠标在电商平台售价149元,实际到手价为119元,如果是在上市前预定&#xff0…

神经网络多层感知器原理解析

多层感知器(Multilayer Perceptron,MLP)是一种基本的前馈人工神经网络模型,常用于解决分类和回归问题。它由一个输入层、一个或多个隐藏层和一个输出层组成,每一层都由多个神经元(或称为节点)组…