php设计模式-注册树模式
php注册树模式
1、什么是注册树模式?
注册树模式通过将对象实例注册到全局对象树上,需要的时候将对象从全局对象树上取下来,就像小时候买糖葫芦一样,卖糖葫芦的将糖葫芦插在一个大的杆子上,人们买的时候就取下来,不同的是,注册树模式摘下来还会有,能摘很多次,糖葫芦摘一次就没了,嘿嘿。
2、为什么要用工厂模式?
前面讲到的单例模式解决了在整个项目中创建唯一对象的问题,
工厂模式解决了不通过new解决实例对象的问题,考虑的是项目扩展与维护。
总得来说单例模式和工厂模式可以产生更加合理的对象,
那么怎么方便统筹调用这些对象呢,这时候就用到了注册树模式,不管你是单例模式,工厂模式还是二者结合生成的对象,都统统给我注册到树上,用某个对象的时候,直接从树上取下来就好。
3、如何实现注册树
我们用“四个一”来记
- 一个静态变量,用于将所有的对象“插入”到注册树上,而且这个注册树应该是一个二维数组。
- 一个插入对象实例的方法(set()),
- 一个撤销对象实例的方法(_unset())。
- 一个读取对象的方法(get())。
拥有这些,我们就可以愉快地完成注册树模式啦~~~
4、代码示例
/**
* @purpose: 创建一个单例类
* Class Single
*/
class Single {
/**
* @var Object 保存类实例的静态成员变量
*/
private static $_instance; /**
* Single constructor. 私有的构造方法
*/
private function __construct(){
echo 'This is a Constructed method;';
} /**
* @purpose: 创建__clone方法防止对象被复制克隆
*/
public function __clone(){
trigger_error('Clone is not allow!',E_USER_ERROR);
} /**
* @return Single|Object 单例方法,用于访问实例的公共的静态方法
*/
public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance = new self;
}
return self::$_instance;
} } /**
* @purpose: 创建一个工厂类
* Class mysqlFactory
*/
class MysqlFactory{ static public function factory($className){
return new $className();
} } interface Mysql{ public function connect();
} class Mysqli implements mysql{ public function connect(){
echo 'mysqli';
}
} class Pdo implements mysql{ public function connect(){
echo 'pdo';
}
} /**
* @purpose: 创建一个注册树模式
* Class Register
*/
class Register
{
/**
* @var array 将所有的对象“插入”到注册树上
*/
static protected $objects; /**
* 插入对象实例
* @param string $alias
* @param object $object 对象实例
*/
public static function set($alias,$object)
{
self::$objects[$alias]=$object;
} /**
* 撤销对象实例
* @param string $alias
*/
public static function _unset($alias)
{
unset(self::$objects[$alias]);
} /**
* 获取对象实例
* @param string $alias
* return object
*/
public static function get($alias)
{
return self::$objects[$alias];
}
} //将工厂和单例生成的数据库对象注册到“注册树”上
Register::set('signal',MysqlFactory::factory('Pdo'));
$signal=Register::get('signal');
$signal->connect();
本文为参考博友博客后编写,感谢博友:https://www.cnblogs.com/freelyflying/p/7019243.html
如有转载请注明出处:https://www.cnblogs.com/chrdai/p/11182796.html
php设计模式-注册树模式的更多相关文章
- php基础设计模式 注册树模式、工厂模式、单列模式
废话不多说了,先给大家介绍注册树模式然后介绍工厂模式最后给大家介绍单列模式,本文写的很详细,一起来学习吧. php注册树模式 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里 ...
- Yii2设计模式——注册树模式
应用举例 在Yii.php中: <?php class ServiceLocator extends Component { //保存实例化的对象,每个对象都是单例,且有唯一string类型的I ...
- php模式设计之 注册树模式
在前两篇单例模式和工厂模式后,终于迎来了最后一个基础的设计模式--注册树模式. 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里矫情一下它的名称,是因为我感觉注册树这个名称更 ...
- PHP设计模式笔记三:三种基本设计模式(工厂模式、单例模式、注册树模式) -- Rango韩老师 http://www.imooc.com/learn/236
一.工厂设计模式 index.php $db = IMooc\Factory::createDatabase(); 使用工厂类的静态方法直接创建一个dababase对象,当类名发生修改时,在工厂里修改 ...
- 2018/04/24 PHP 设计模式之注册树模式
之前学习了工厂模式和单例模式,明白了他们的意义. 但是我们在之后的使用中会发现一个问题,在新建一个实例的时候还是需要调用一个单例或者工厂,之后还是造成了代码和耦合和不好处理. 下面开始说一下: -- ...
- php设计模式之注册树模式
什么是注册树模式?[全局共享和交换对象] 注册树模式当然也叫注册模式,注册器模式.注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法. 这让我想起了小时候买糖 ...
- PHP设计模式_注册树模式
通过注册树模式可以更加简单快捷的获取对象,在某个地方实例化了一个对象,可以将这个对象“保存”起来(放入可以全局使用的数组里),用的时候只需要提供 保存对象的时候 的那个标识即可,解决全局共享和交换对象 ...
- PHP模式设计之单例模式、工厂模式、注册树模式、适配器模式、观察者模式
php模式设计之单例模式 什么是单例模式? 单例模式是指在整个应用中只有一个实例对象的设计模式 为什么要用单例模式? php经常要链接数据库,如果在一个项目中频繁建立连接数据库,会造成服务器资源的很大 ...
- PHP 注册树模式
/** * 注册树模式 * 将对象注册到一个类中 * 通过该类实现全局访问操作对象 */ class Tree { private static $treeList = []; private fun ...
随机推荐
- JS通过sort(),和reverse()正序和倒序
sort()正序 var array1 = [0,1,5,10,15]; array1.sort();//结果为:0,1,10,15,5 请注意,上面的代码没有按照数值的大小对数字进行排序,要 ...
- LLVM 安装教程(包安装)
LLVM 安装教程 环境:ubuntu16.04 llvm-4.0 clang-4.0 步骤: 1.依赖库安装 $ sudo apt-get install build-essential curl ...
- 直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解
JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...
- Navicat安装、使用教程
下载地址:Navicat的安装包及破解文件 一. Navicat安装 Navicat既可安装在服务器端,也可以安装在客户端.安装在服务器端,导入数据时可使用默认用户,也可以使用远程用户:安装在客户端, ...
- Zabbix报错:"Zabbix http poller processes more than 75% busy"的解决
一.钉钉收到告警 主机名称:Zabbix服务端-172.28.18.75 IP地址 :127.0.0.1 告警时间:2019.10.22 13:34:39 告警信息:Zabbix http polle ...
- 一个微信小程序跳转到另一个微信小程序
简单来说分两步走: 1.配置项目根目录的 app.json 文件中的 navigateToMiniProgramAppIdList { "pages": [ "pages ...
- nginx反向代理原理及配置详解
nginx概述nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外n ...
- canvas画圆又毛边
canvas使用arc()画园有毛边,如图:,只需给其添加width,height即可,直接上代码 <!DOCTYPE html> <html lang="en" ...
- sys.argv的意义及用法
sys.argv的意义 简单来说,sys.argv是一个参数列表,这个列表存放着从外界获取到的参数(可能有多个) 下面以一个例子来详细阐述sys.argv,本次演示在ubuntu环境下运行 新建一个t ...
- Python CGI编程Ⅶ
简单的表单实例:GET方法 以下是一个通过HTML的表单使用GET方法向服务器发送两个数据,提交的服务器脚本同样是hello_get.py文件,hello_get.html 代码如下: 默认情况下 c ...