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. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。
php中this,self,parent,const关键字的用法 PHP面对对象设计模式之工厂模式