php注册树模式,PHP设计模式之详记注册树模式
一、什么是注冊樹模式
注冊樹模式又叫注冊模式、注冊器模式。注冊樹模式是將經常使用到的對象實例掛到一顆全局的樹上,需要使用時從數樹上取出即可。
舉個栗子:有一個空的工具箱。需要維修東西,因此買了扳手和螺絲刀等工具,將它們放到空的工具箱中。
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设计模式之详记注册树模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的usermod命令参数,li
- 下一篇: php-rpm.conf,在新安装的宝塔