快速搞定php单例模式
来源:互联网 发布:刺客袖剑淘宝 编辑:程序博客网 时间:2024/05/23 09:43
单例模式,正如其名,允许我们创建一个而且只能创建一个对象的类。
这在整个系统的协同工作中非常有用,特别明确了只需一个类对象的时候。
那么,为什么要实现这么奇怪的类,只实例化一次?
在很多场景下会用到,如:配置类、Session类、Database类、Cache类、File类等等。
这些只需要实例化一次,就可以在应用全局中使用。
本文我们以数据库类为例。
1 问题
如果没有使用单例模式,会有什么样的问题?
如下是一个简单的数据库连接类,它没有使用单例模式。
class Database{
然后创建3个对象:
$config = array(
这种情况下,每当我们创建一个这个类的实例,就会新增一个到数据库的连接。
开发者每在一个地方实例化一次这个类,就会在那里多一个数据库连接。
不知不觉中,开发者就犯了个错误,给数据库和服务器性能带来巨大的影响。
上面的代码输入如下:
object(Database)[1]
每个对象都分配一个新的资源ID,都是新的引用,它们占用3个的内存空间。
如果有100个对象创建,就会占用内存中100块不同的空间,而其余99块并非是必须的。
2 解决
开发者怎样使用基础框架,如何数据库连接,这很难控制。
如果在代码评审阶段再找出问题,又会浪费大量的人力物力。
要解决这样的问题,我们可以控制住基类,在源头上限制这个类,使其无法生成多个对象,如果已经生成过,直接返回。
于是,我们的目标就是,控制数据库类,使其生成一次而且只能生成一次对象。
如下就是单例模式连接数据库代码:
class Database{
再通过getInstance()方法使用类对象,
$config = array(
输出信息如下:
object(Database)[1]
对比两个输出可以看出,单例模式中,不同对象获得的资源ID是一样的。
也就是说,虽然我们用getInstance()获取Database类对象3次,其实引用的是一个内存空间,PDO也只连接了数据库一次。
以上的例子是数据库连接类,要使用数据库,在应用这样获得连接句柄:
$db = database::getInstance($config)->db();
如果是其他类,则按需要修改数据库相关的代码,单例实现部分保留。
3 特点
单例模式的特点是4私1公:一个私有静态属性,构造方法私有,克隆方法私有,重建方法私有,一个公共静态方法。
其他方法根据需要增加。
最基础的单例模式代码如下:
class Singleton{
$instance用以保存类的实例化,getInstance()方法提供给外部本类的实例化对象:
对应的UML图如下,
单例模式在应用请求的整个生命周期中都有效,这点类似全局变量,会降低程序的可测试性。
大部分情况下,也可以用依赖注入来代替单例模式,避免在应用中引入不必要的耦合。
所以,对于仅需生成一个对象的类,首先考虑用依赖注入方式,其次考虑用单例模式来实现。
标签:
参考资料:
Design Patterns: The Singleton PatternDesign Patterns - PHP The Right WayFive common PHP design patternsPhp中的单例模式面面观 / 编写一个单例的基类PHP单例模式详细介绍
- 快速搞定php单例模式
- php单例模式
- php单例模式
- PHP单例模式
- PHP单例模式
- PHP单例模式
- php 单例模式
- php单例模式
- PHP 单例模式
- PHP 单例模式
- php 单例模式
- php单例模式
- PHP单例模式
- php单例模式
- php单例模式
- PHP单例模式
- php单例模式
- php单例模式
- List集合中的元素排序
- 关于一加载jsp页面就跳转到servlet获取数据然后再跳回jsp页面的问题
- 读书笔记《神经网络与深度学习》
- Nginx配置文件详细说明
- GreenDAO 3.0 不修改版本号的情况下增加、删除表、添加字段
- 快速搞定php单例模式
- 运动轨迹
- 读书笔记《Effective C++》条款35:考虑virtual函数以外的其他选择
- 如何通过curl完成一些功能
- java 反射机制学习
- Winsock(微软套接字接口)的使用(2)
- CSU
- Dell 14R N4120笔记本电脑加固态硬盘
- Winsock(微软套接字接口)的使用(3)