在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
* 注册树:其实就是创建一个对象集,也叫对象池,是用数组来进行存储的
class Demo1 {} class Demo2 {} class Demo3 {} //声明对象注册树类
class Register { //静态属性中保存着所有已经挂载到树上的对象 public static $objs = []; //将对象挂载到树上 public static function set($index,$obj) { self::$objs[$index] = $obj; } //取出对象使用 public static function get($index) { return self::$objs[$index]; } //已经无效的对象,及时销毁,节省资源 public static function del($index) { unset(self::$objs[$index]); } } //先将三个类实例化后挂载到对象树上 Register::set('demo1',new Demo1); Register::set('demo2',new Demo2); Register::set('demo3',new Demo3); //检测是否上树? var_dump(Register::$objs); echo '<hr>'; echo '<pre>'.print_r(Register::$objs,true).'</pre>'; echo '<hr>'; //用注册类的get方法查看 var_dump(Register::get('demo2')); //删除对象池中的某个实例对象 Register::del('demo2'); //再次查看demo2对象,已经不能被查看了,因为被销毁了 var_dump(Register::get('demo2'));
<?php //创建单例 class Single{ public $hash; static protected $ins=null; final protected function __construct(){ $this->hash=rand(1,9999); } static public function getInstance(){ if (self::$ins instanceof self) { return self::$ins; } self::$ins=new self(); return self::$ins; } } //工厂模式 class RandFactory{ public static function factory(){ return Single::getInstance(); } } //注册树 class Register{ protected static $objects; public static function set($alias,$object){ self::$objects[$alias]=$object; } public static function get($alias){ return self::$objects[$alias]; } public static function _unset($alias){ unset(self::$objects[$alias]); } } Register::set('rand',RandFactory::factory()); $object=Register::get('rand'); print_r($object); 单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法。 那么注册树模式想解决什么问题呢? 在考虑这个问题前,我们还是有必要考虑下前两种模式目前面临的局限。 首先,单例模式创建唯一对象的过程本身还有一种判断,即判断对象是否存在。存在则返回对象,不存在则创建对象并返回。 每次创建实例对象都要存在这么一层判断。 工厂模式更多考虑的是扩展维护的问题。 总的来说,单例模式和工厂模式可以产生更加合理的对象。怎么方便调用这些对象呢?而且在项目内如此建立的对象好像散兵游勇一样,不便统筹管理安排啊。因 而,注册树模式应运而生。不管你是通过单例模式还是工厂模式还是二者结合生成的对象,都统统给我“插到”注册树上。我用某个对象的时候,直接从注册树上取 一下就好。这和我们使用全局变量一样的方便实用。 而且注册树模式还为其他模式提供了一种非常好的想法。
一、工厂设计模式
index.php
$db = IMooc\Factory::createDatabase();
使用工厂类的静态方法直接创建一个dababase对象,当类名发生修改时,在工厂里修改即可。
IMooc/Factory.php
二、单例设计模式
保证在整个脚本运行期间,只有一个对象的实例,比如数据库操纵对象
Database.php
index.php output同一个对象; object(IMooc\Database)#1 (0) { } object(IMooc\Database)#1 (0) { } object(IMooc\Database)#1 (0) { } 三、注册树模式 将对象注册到全局的注册树上,一般是在环境初始化时,将对象注册,在实现业务逻辑时,直接get获取即可; 注册树类Register.php 在工厂类里进行注册,将$db注册到$register注册树上 在index.php中调用createDatabase进行注册 1 (0) { } |
2022-08-30
2022-08-17
2022-07-29
2022-11-06
2022-08-18
请发表评论