明凯博客

关注网站技术,一个特立独行的程序员

PHP面对对象设计模式之单例模式

单例模式是面向对象语言里最常用、也是最简单的一种模式。

单例就是单个实例,单个对象的意思,就是说我们去实例化一个类的时候,不管调用多少次,都永远只有一个实例, 不会有多个,这样就节省了内存分配开支。

单例模式的原理:

将构造函数__construct设置为私有的private, 对外提供一个static静态方法比如:getInstance获得实例,在getInstance方法里来做统一判断是否有new一个实例,有的话直接返回,没有就new一个,这样就保证了不管外面调用多少次,只保证new了一次。

单例模式的例子:

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
< ?php
// PHP面对对象设计模式之单例模式
class Single{
    private $props = array();
    // 保存例实例在此属性中
    private static $instance;
    // 构造函数声明为private,防止直接创建对象
    private function __construct(){}
    // 单例方法
    public static function getInstance(){
        if(empty(self::$instance)){
            self::$instance = new Single();
        }
        return self::$instance;
    }
    // 设置属性和属性值
    public function setProperty($key,$val){
        $this->props[$key] = $val;
    }
    // 读取值
    public function getProperty($key){
        return $this->props[$key];
    }
}
// 得到Single类的单例对象
$single1 = Single::getInstance();
// 设置一个属性 name 的值 为明凯博客
$single1->setProperty("name","明凯博客");
// 移除引用
unset($single1);
// 得到Single类的单例对象
$single2 = Single::getInstance();
// 输出属性name 的属性值 该属性值未丢失 
print $single2->getProperty("name");

返回:

明凯博客

从结果我们看出,$single1和$single2其实是同一个引用的,这样就达到了我们的目的。而且也节约了内存。在同一个生命周期中,不管调用多次,永远只有一个实例。

单例模式的用处:
用处是确保某个类只有一个实例,避免产生多个对象消耗过多的资源,或者某个类型的对象只应该有一个。

创建一个对象需要消耗的资源过多,这时就要考虑使用单例模式。
1. 网站的计数器,一般也是采用单例模式实现,同步起来非常简单。

2. 网站的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

3. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。

4. 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。

5. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。

, ,

相关文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注