一、什么是注册树模式

注册树模式又叫注册模式、注册器模式。注册树模式是将经常使用到的对象实例挂到一颗全局的树上,需要使用时从数树上取出即可。

举个栗子:有一个空的工具箱。需要维修东西,因此买了扳手和螺丝刀等工具,将它们放到空的工具箱中。

1、把工具放到工具箱中可以理解为对象上树

2、需要某个或某些工具时,从工具箱中取出来,可以理解为获取对象树中的对象

3、使用工具去维修物品,可以理解为使用对象

注册树模式不在二十四种设计模式当中,但它是一个非常实用的设计模式,如Laravel、ThinkPHP5.1/6都使用到了它。 理解注册树模式对于去理解框架源码非常有帮助。

二、代码实现

Singleton.php<?php

/**

* 单例模式

*/

class Singleton

{

private static $instance = null;

private function __construct() {}

private function __clone() {}

private function __wakeup() {}

/**

* getInstance 唯一获取实例对象的静态方法

*

* @param  String $className 类名

* @return object 唯一实例对象

*/

public static function getInstance($className)

{

// 类名首字母大写

$className = ucfirst($className);

// 判断实例对象是否是该类的实例,如果是,说明已经实例化

// 则直接返回

if (self::$instance instanceof $className) {

return self::$instance;

}

// 若不是该类的实例,则还没有进行实例化,则进行类实例

return self::$instance = new $className();

}

}

Factory.php<?php

/**

* 工厂模式

*/

class Factory

{

/**

* make 生产对象

*

* @param  string $className 类名

* @return object 实例对象

*/

public static function make($className)

{

return Singleton::getInstance($className);

}

}

Register.php<?php

/**

* 注册树模式

*/

class Register

{

// 对象树池数组

private static $objects = [];

/**

* set 设置对象入对象树池

*

* @param  string $alias  对象别名

* @param  object $object 对象

* @return [type]         [description]

*/

public static function set($alias , $object)

{

// 将对象挂到对象树池子上

self::$objects[$alias] = $object;

}

/**

* get 取出对象

*

* @param  string $alias 对象别名

* @return object 对象实例

*/

public static function get($alias)

{

// 从对象树池中取出对象

return self::$objects[$alias];

}

/**

* destroy 销毁对象

*

* @param  string $alias 对象别名

*/

public static function destroy($alias)

{

unset($objects[$alias]);

}

}

User.php<?php

// 普通用户类

class User

{

public function say()

{

return '啊哈哈哈,揣摩看看~~~我是怎么出来的~~~';

}

}

Index.php<?php

include './Singleton.php';

include './Factory.php';

include './Register.php';

include './User.php';

class IndexController

{

public function index()

{

// 将对象挂载到对象树池中

Register::set('user' , Factory::make('User'));

// 从对象树池中获取对象

$user = Register::get('user');

// 调用user类的方法

echo $user->say();

}

// 测试实例多个对象是否唯一

public function test()

{

Register::set('user1' , Factory::make('User'));

Register::set('user2' , Factory::make('User'));

$user  = Register::get('user');

$user1 = Register::get('user1');

$user2 = Register::get('user2');

// 可见,只有一个实例对象

var_dump($user);    // object(User)#2 (0) { }

var_dump($user1);   // object(User)#2 (0) { }

var_dump($user2);   // object(User)#2 (0) { }

}

}

$idx = new IndexController();

echo $idx->index();

$idx->test();

我是小白,期待和优秀的你一起同行!

小白

2020年10月13日

转载:感谢您对自如初博客网站的认可,所有文章均属原创文章,技术类文章转载请注明出处,“自如初博客”;文学类文章请带文本链接地址,否则视为侵权!

很赞哦!(3)

php注册树模式,PHP设计模式之详记注册树模式相关推荐

  1. C++设计模式--单例模式详解(懒汉模式、饿汉模式、双重锁)

    C++设计模式--单例模式详解(懒汉模式.饿汉模式.双重锁) 应用场景 一.单例模式是什么? 二.使用步骤 1.UML图 2.代码实现 应用场景 通常我们在做通讯的时候,我们跟服务器数据交互,假如每次 ...

  2. java实现备忘录模式_设计模式之第17章-备忘录模式(Java实现)

    设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...

  3. php 抽象工厂模式,PHP设计模式(三)抽象工厂模式(Abstract Factory)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...

  4. java设计模式中不属于创建型模式_Java设计模式(5)——创建型模式之建造者模式(Builder)...

    一.概述 概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.(与工厂类不同的是它用于创建复合对象) UML图 主要角色 抽象建造者(Builder)--规范建造方法与结果返还 ...

  5. java 装饰器模式_Java设计模式(9)----------装饰器模式

    1.介绍 装饰器模式是一种结构型的设计模式.使用该模式的目的是为了较为灵活的对类进行扩展,而且不影响原来类的结构.有同学说可以通过继承的方式进行实现啊,没错,继承的确可以实现,但是继承的成本相对比较高 ...

  6. php 状态模式,PHP设计模式(十九)—状态模式 (State Pattern)

    状态模式 (State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类.其别名为状态对象(Objects for States) (一)为什么需要状态模式 ...

  7. sapmto生产模式配置及操作详解_MTO生产模式简介

    MTO 生产模式简介 随着市场需求的日趋多样化, 现在越来越多的制造企业都采用了面向订单生产的制造策 略. 笔者根据在面向订单生产企业的多年工作经验和信息化经验, 总结了这类企业业务管理 和信息化的主 ...

  8. java的visitor模式_java设计模式(二十一)访问者模式(Visitor)

    介绍 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问者模式是一种对象行为型模式. 简单来 ...

  9. sapmto生产模式配置及操作详解_SAP生产模式和计划策略

    一.SAP生产模式的主要计划策略 A.MTS(Make To Stock 按库存生产) 生产订单与销售订单无直接关联,一般根据预测适时安排生产或提前备料,这种预测企业里常叫Forecast,对应SAP ...

最新文章

  1. git: No refs in common and none specified; doing no
  2. 排序算法的时间复杂度_算法的时间复杂度
  3. java 判断端口是否被占用_java检测端口是否被占用详解
  4. php提交表单显示错误,php – 在提交注册表单时使用jQuery显示错误
  5. uc3842改可调电源教程_明纬开关电源改可调详细教程
  6. 2017.7.28 愤怒的小鸟 思考记录
  7. bzoj 1014 火星人prefix —— splay+hash
  8. 谷歌浏览器设置新标签页地址的方法
  9. 基础学习笔记之opencv(2):haartraining前将统一图片尺寸方法
  10. 新ICT:引爆物联网的变革潜能
  11. 组态王bitset用法_组态王使用问题解答8
  12. 科大讯飞与IBM组队人工智能蓝蓝CP
  13. 数学模型转化为计算机语言,程序设计语言类课程教学选题方法探讨
  14. [转载]丢掉鼠标-Mac神软Alfred使用手册1_我是亲民_新浪博客
  15. xml转pdf xsl取值问题 语法问题
  16. 官宣!美国通讯芯片巨头博通610亿美元收购云计算巨头威睿 | 美通社头条
  17. iOS15-16绕过激活锁,屏幕锁完美隐藏工具老虎V4.5,支持最新iOS16.1.1系统
  18. Unity 3D游戏开发 - U3D进阶 | 声音组件之 AudioSource
  19. 微软Win11 KB5017385发布 版本号升至 22623.730 22621.730
  20. vivado dcp生成

热门文章

  1. html提交表单使用python计算_教你使用Python实现新个税计算器
  2. linux 内核 82540网卡,Linux网卡as4.2 编译安装及配置准备
  3. jsp论坛网站模版_网站被降权了?看看这些解决方法,或许有帮助哦
  4. jupyter(Anaconda)设置默认打开文件夹
  5. 虚拟服务器的好处与坏处,常见服务器虚拟化的弊端主要是什么问题?
  6. 亲身经历之微信支付沙箱环境扫码支付遇到的那些坑
  7. 《剑指offer》第五十三题(数组中数值和下标相等的元素)
  8. @PathVariable、@RequestParam、@RequestBody注解
  9. P4 类、对象、类成员简介
  10. angularjs启动项目报ERROR in AppModule is not an NgModule解决方法