我是靠谱客的博主 能干夏天,这篇文章主要介绍使用注册树及工厂模式来替代使用单例模式实践(附案例),现在分享给大家,希望可以做个参考。

实现代码

注册器模式非常容易理解和实现。一般会有一个属性用来存放多个对象实例,以及set及get方法。set方法用来将对象实例保存在属性数组中,get方法用来或取想要的对象实例。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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]); } } }
登录后复制

使用注册树模式和工厂模式来代替单例模式

我们知道,单例是非常有用的,可以避免资源浪费等。但是,单例模式已经被认为是一种反面模式了,认为单例模式不好测试及维护。关于为什么单例模式被认为是反面模式,这里就不细说了,有兴趣的朋友可以自行谷歌。

那么,我们有没有其他的方法用来保证单例,但不使用单例模式呢?有的,我们可以使用注册树模式和工厂模式来替代单例模式。下面是具体代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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即可,该方法保证了单例。下面是测试代码:

复制代码
1
2
$db = DbFactory::create(); var_dump($db);
登录后复制

以上就是使用注册树及工厂模式来替代使用单例模式实践(附案例)的详细内容,更多请关注靠谱客其它相关文章!

最后

以上就是能干夏天最近收集整理的关于使用注册树及工厂模式来替代使用单例模式实践(附案例)的全部内容,更多相关使用注册树及工厂模式来替代使用单例模式实践(附案例)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(113)

评论列表共有 0 条评论

立即
投稿
返回
顶部