什么是注册树模式
想象一下树形的挂衣架,你想穿哪个衣服了就拿哪个衣服,注册树模式就像极了挂衣架。注册树模式以一个数组来保存所有会用到的实例,等到用这个实例的时候直接去数组中取就可以了,避免多次创建这个实例。
使用场景
很多框架会用到注册树模式,比如用户众多的Laravel框架。
优点
降低资源消耗,提高程序效率
示意图
项目目录结构
代码示例
HashGenarate.php 生成hash的单例类
<?php
class HashGenarate{
public $hash;
protected static $_instance;
final protected function __construct(){
$this->hash = hash('sha384',rand(99999,99999999).time());
}
public static function getInstance(){
if(!self::$_instance){
self::$_instance = new self();
}
return self::$_instance;
}
private function __clone()
{
// TODO: Implement __clone() method.
}
}
RegisterContainer.php 注册实例到容器类
<?php
/**
* 容器注册
* Class RegisterContainer
*/
class RegisterContainer
{
//注册树,用来保存容器启动需要的对象实例
public static $_tree = [];
//新增对象实例
static function add($alias, $object)
{
self::$_tree[$alias] = $object;
}
//获取对象实例
static function get($alias)
{
return self::$_tree[$alias];
}
//删除对象实例
static public function del($alias)
{
unset(self::$_tree[$alias]);
}
}
Container.php 容器类
<?php
require_once 'HashGenarate.php';
require_once 'RegisterContainer.php';
/**
* 容器
* Class Container
*/
class Container
{
public function register()
{
//注册一个单例到容器
RegisterContainer::add(HashGenarate::class, HashGenarate::getInstance());
}
public function getHash($alias)
{
//获取该单例
$object = RegisterContainer::get($alias);
echo $object->hash;
}
public function del($alias){
//删除该单例
RegisterContainer::del($alias);
}
}
$container = new Container();
$container->register();
$container->getHash(HashGenarate::class);
$container->del(HashGenarate::class);