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 ...
随机推荐
- Oracle创建表和创建序列和修改,增加sql字段
一.创建表 create table y_parts_classify( pt_id number(10) not null, pt_name varchar2(1000), update_time ...
- Nginx默认配置语法
Nginx默认配置语法 1. 我们进入 /etc/nginx/目录下,打开 nginx.conf文件 2. 我们来解析下 这里面标签和各模块的作用 # 设置nginx服务的系统使用用户 user ...
- 访问gitlab从http方式改为ssh方式,gitlab使用的不是标准22端口
设置步骤:1,本地进入.ssh查看是否存在密钥对:xxx和xxx.pub命令:cd ~/.ssh2,如果不存在,使用ssh-keygen来创建命令:ssh-keygen -t rsa -C " ...
- Cocoapods私有库
http://www.jianshu.com/p/d6a592d6fced 1.创建两个什么都不选的远程仓库:(私有公有都可,ReadMe\ignore都不选),一个放代码,一个放源(*.podspe ...
- mysql explain解析一 extra中的using index,using where,using index condition
1.简单介绍 using index 和using where只要使用了索引我们基本都能经常看到,而using index condition则是在mysql5.6后新加的新特性,我们先来看看mysq ...
- MobileNet系列
最近一段时间,重新研读了谷歌的mobilenet系列,对该系列有新的认识. 1.MobileNet V1 这篇论文是谷歌在2017年提出了,专注于移动端或者嵌入式设备中的轻量级CNN网络.该论文最大的 ...
- deep_learning_Function_tf.control_dependencies([])
tf.control_dependencies([])函数含义及使用 2019.02.23 14:01:14字数 60阅读 420 tf.control_dependencies([controls_ ...
- fwrite()
fwrite(),最好写strlen()个字节,否则可能有乱码
- k8spod生命周期
pod对象自从创建开始至终止退出的时间范围称为生命周期,在这段时间中,pod会处于多种不同的状态,并执行一些操作:其中,创建主容器为必须的操作,其他可选的操作还包括运行初始化容器(init conta ...
- JSP中的四种作用域?
page.request.session和application,具体如下: ①page 代表与一个页面相关的对象和属性. ②request 代表与Web客户机发出的一个请求相关的对象和属性.一个请求 ...