该文章属于《编程中的那些经典套路——设计模式汇总》系列,而且如下内容基于语言PHPphp
在设计模式中,单例模式和工厂模式)能够说是使用的最广泛的设计模式了,因此掌握此种模式尤其重要。java
单例模式通常使用在资源共享和须要控制资源的状况下。mysql
例如:购物车,回收站,数据库链接池,计数器,配置文件共享等全部项目中只须要存在一个的模块,你均可以采用单例模式。redis
单例模式的好处就在于当前进程只产生一个对象(或者叫作模块),
但有一点须要指出,若是单例模式的操做对象是一个资源类型,那么此时的单例模式并非纯粹的单例模式,由于php的生命周期仅仅是页面级别的,因此他没法像Java语言那样在内存中将这个资源类型存起来,而且咱们也没法借助相似redis的nosql缓存数据库,由于资源类型(相似mysql_connect的返回值)是没法被序列化(指的是资源没法转成字符串)。sql
即,php的单例,仅指进程中单例,不似java,在整个内存中单例,因此在PHP语言下,单例模式是有瑕疵的。数据库
上代码:编程
单例模式.phpsegmentfault
<?php class Database { //数据库链接资源 protected static $_db; //单例标识符 protected static $_instance; //设可见性设置成private,防止外部进行 实例化操做 private function __construct(){ } //外部调用的是 getInstance public static function getInstance(){ if (self :: $_instance === null) { self::$_instance = new self(); self::$_db = mysql_connect('localhost','root','root'); echo '只有一次实例化'; } return self::$_instance; } public function select_db($db){ return mysql_select_db($db,self::$_db); } //设可见性设置成private,防止外部进行 clone操做 private function __clone(){ } } $db = Database::getInstance(); print_r($db->select_db('test')); print_r($db->select_db('test')); print_r($db->select_db('test')); //output:只有一次实例化111 ?>
经过输出(output)能够看出页面执行中,数据库类(class Database)只有第一次调用的时候是真实实例化的,剩下的调用都是直接从静态变量获取该实例的,这样的话就防止了在一次生命周期中屡次链接数据库了,极大的节省了资源,这就是单例模式。设计模式