码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之创建型模式—— 1.4 单例模式

时间:2015-02-17 23:43:52      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:设计模式 单例模式

<?php

	/**
	 * 1.4 单例模式
	 * 	解决的问题:
	 *  	如何确保一个特殊类的实例是独一无二的
	 *  	,也就是说这个实例是它所属类的唯一一
	 *  	个实例对象,并且很容易的对它进行存取?
	 *  解决的方案:
	 *  	保证一个类仅有一个实例,并提供一个访
	 *  	问它的全局访问点。
	 *  该模式包含一种角色:
	 *  	1. 单例角色
	 *  优点:
	 *  	1. 始终保持唯一的一个实例。
	 *  	2. 可对此唯一实例进行访问控制。
	 *  缺点:
	 *  	1. 虽然实例数量很少,但每次请求引用时
	 *  	   都要检查是否存在类的实例,所以仍然
	 *  	   存在一些开销。可以通过使用静态初始
	 *  	   化解决此问题。
	 *  	2. 因为不能实例化,所以开发人员必须记
	 *  	   住某个类不能使用new关键字产生对象。
	 *  	
	 *  使用场景:
	 *  	1. 当类只能有一个实例而且客户可以从一
	 *  	   个众所周知的访问点访问它时。
	 *  	2. 当这个唯一实例应该是通过子类化可扩展
	 *  	   的,并且客户应该无需改代码就能使用一
	 *  	   个扩展的实例时。
	 */


	/**
	 * 单例角色,三要素:
	 * 		1. 必须有一个静态成员变量保存实例;
	 * 		2. 只提供私有的构造函数;
	 * 		3. 必须有一个静态函数用于创建获取
	 * 		   静态成员变量。
	 * 		4. 私有化克隆函数
	 */
	class DB{
		private $con;
		protected static $db;
		private function __construct(){
			$this->con=new mysqli(‘localhost‘,‘root‘,‘123456‘,‘test‘);
			echo ‘建立一次数据库连接‘;	
		}

		public static function getInstance(){
			if(! self::$db instanceof self){
				self::$db=new self();
			}
			return self::$db;
		}

		private function __clone(){}
	}

	//客户端
	$db=DB::getInstance();
	$db2=DB::getInstance();
	// $db3=clone $db;
	echo $db===$db2 ? ‘OK‘:‘NO‘;

?>


本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614771

设计模式之创建型模式—— 1.4 单例模式

标签:设计模式 单例模式

原文地址:http://noican.blog.51cto.com/4081966/1614771

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!