设计模式php实例:单例模式
单个类例模式要求一只能实例化一次,并且实例化的过程由该类自身执行。
在一些情况下系统只需要一个全局的对象,以协调整个系统的行为。在具体的php应用中单例模式可以封装应用的配置,数据库连接等其他资源的加载,以达到节省空间资源的效果。另外在多线程的情况下(php应用中中并不多),比如同时进行文件创建、打开、修改一个文件的操作时用单例可以实现锁机制。
单例模式在应用中减少了代码量,就像全局变量一样,用起来是挺爽的,但是它也有缺点,不能够滥用:单例模式不能扩展,想给单例加代码只能在原因类中改,违反开闭原则。它的隐式依赖引起的结构不清晰,客户端需要了解其结构。一般情况下其他代码对单例是一种依赖关系的调用,耦合度较大。
单例模式类图:
ZF中单例代码实例:
class Zend_Controller_Front{... protected static $_instance = null;... protected function __construct() { $this->_plugins = new Zend_Controller_Plugin_Broker(); } /** * Enforce singleton; disallow cloning * * @return void */ private function __clone() { } public static function getInstance() { if (null === self::$_instance) { self::$_instance = new self(); } return self::$_instance; }....}
上面列子中单例在外部调用的时候才加载,即所谓的“懒汉式”模式,另外一种“饿汗式”是在类初始化时候就回实例化本身。前者是以时间换空间,后者是以空间换时间,好在前者只消耗一次判断的时间,所有懒汉式单例模式在代码中用的较为多些。