使用注册树及工厂模式来替代使用单例模式实践(附案例)
发布:smiling 来源: PHP粉丝网 添加日期:2022-07-20 17:21:56 浏览: 评论:0
今天在php中文网和大家介绍下一种结构型设计模式——注册树模式,别名注册器模式或注册模式,它是用来保存程序中经常使用的对象的实例,注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘,但和现实中的采摘不同的是,从对象树上摘下来的果子依旧存在对象树上,下次还可以继续摘。
实现代码
注册器模式非常容易理解和实现。一般会有一个属性用来存放多个对象实例,以及set及get方法。set方法用来将对象实例保存在属性数组中,get方法用来或取想要的对象实例。
- class Registry
- {
- // 保存实例对象
- private static $objs = [];
- // get获取实例对象
- public static function get(string $alias) : Object
- {
- if (!isset(self::$objs[$alias])) {
- throw new \Exception($alias . 'not found');
- }
- return self::$objs[$alias];
- }
- // set将实例对象注册到属性$objs中
- public static function set (string $alias, Object $obj) : void
- {
- if (!isset(self::$objs[$alias])) {
- self::$objs[$alias] = $obj;
- }
- }
- // 注销实例
- public static function unset (string $alias) :void
- {
- if (isset(self::$objs[$alias])) {
- unset(self::$objs[$alias]);
- }
- }
- }
使用注册树模式和工厂模式来代替单例模式
我们知道,单例是非常有用的,可以避免资源浪费等。但是,单例模式已经被认为是一种反面模式了,认为单例模式不好测试及维护。关于为什么单例模式被认为是反面模式,这里就不细说了,有兴趣的朋友可以自行谷歌。
那么,我们有没有其他的方法用来保证单例,但不使用单例模式呢?有的,我们可以使用注册树模式和工厂模式来替代单例模式。下面是具体代码:
- class Registry
- {
- // 保存实例对象
- private static $objs = [];
- // get获取实例对象
- public static function get(string $alias)
- {
- if (!isset(self::$objs[$alias])) {
- return null;
- }
- return self::$objs[$alias];
- }
- // set将实例对象注册到属性$objs中
- public static function set (string $alias, Object $obj) : void
- {
- if (!isset(self::$objs[$alias])) {
- self::$objs[$alias] = $obj;
- }
- }
- // 注销实例
- public static function unset (string $alias) :void
- {
- if (isset(self::$objs[$alias])) {
- unset(self::$objs[$alias]);
- }
- }
- }
- class DbFactory
- {
- const ALIAS = 'Db';
- public static function create ()
- {
- $db = Registry::get(self::ALIAS);
- if (!$db) {
- $db = new Db([
- 'host' => 'localhost',
- 'user' => 'root',
- 'pass' => '',
- 'db_name' => 'test'
- ]);
- Registry::set(self::ALIAS, $db);
- }
- return $db;
- }
- }
当我们需要Db实例是,只要去调用DbFactory::create即可,该方法保证了单例。下面是测试代码:
$db = DbFactory::create();
var_dump($db);
Tags: php注册树 php单例模式
- 上一篇:php设计模式:桥接模式学习心得(附案例代码)
- 下一篇:最后一页
相关文章
- ·PHP单例模式总结教程(2015-04-04)
- ·PHP单例模式编写的PDO类的程序(2015-04-15)
- ·php设计模式——单例模式(Singleton)的常见应用场景(2015-04-15)
- ·php 设计模式之单例模式例子(2016-07-27)
- ·PHP设计模式之:单例模式的学习笔记(2016-07-29)
- ·PHP 单例模式优点意义及如何实现(2018-10-28)
- ·php单例模式实现方法分析(2021-05-16)
- ·PHP设计模式之单例模式原理与实现方法分析(2021-09-12)
- ·PHP单例模式应用示例【多次连接数据库只实例化一次】(2021-11-02)
- ·PHP设计模式之单例模式入门与应用详解(2022-01-26)
- ·PHP中用Trait封装单例模式的实现(2022-01-28)
- ·PHP实现单例模式建立数据库连接的方法分析(2022-02-11)
- ·php的单例模式及应用场景详解(2022-04-14)
- ·在 PHP 中将 Redis 封装成单例模式(2022-06-23)
- ·聊聊PHP中的单例模式与静态变量(2022-07-16)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)