设计模式之 : 单例模式

来源:互联网 发布:海康网络监控安装教程 编辑:程序博客网 时间:2024/06/17 03:08

单例模式(Singleton):用于为一个类生成一个唯一的对象。

特点:

1、一个类只能有一个实例2、它必须自行创建这个实例3、它必须自行向整个系统提供这个实例

使用场景:

单例模式一般使用在资源共享和需要控制资源的情况下:例如:购物车,回收站,数据库连接,计数器,配置文件共享等所有项目中只需要存在一个的模块,你都可以采用单例模式。

实现 :

三私一公①私有化构造方法:防止实例化②私有化克隆方法:防止克隆③私有化静态属性:保存对象④私有化静态方法:获取对象

代码实例:

 <?php    class Database {        //数据库连接资源        protected static $_db;        //单例标识符        private static $_instance = NULL;        //定义一个私有的构造函数,确保单例类不能通过new关键字实例化,只能被其自身实例化        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);        }        //定义私有的__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)只有第一次调用的时候是真实实例化的,剩下的调用都是直接从静态变量获取该实例的,这样的话就防止了在一次生命周期中多次连接数据库了,极大的节省了资源,这就是单例模式。

pdo类单例模式实例:http://blog.csdn.net/u013372487/article/details/52700674

注意:

单例模式的好处就在于当前进程只产生一个对象(或者叫做模块),但有一点需要指出,如果单例模式的操作对象是一个资源类型,那么此时的单例模式并不是纯粹的单例模式,因为php的生命周期仅仅是页面级别的,所以他无法像Java语言那样在内存中将这个资源类型存起来,并且我们也无法借助类似redis的nosql缓存数据库,因为资源类型(类似mysql_connect的返回值)是无法被序列化(指的是资源无法转成字符串)。即,php的单例,仅指进程中单例,不似java,在整个内存中单例,所以在PHP语言下,单例模式是有瑕疵的。
0 0
原创粉丝点击