PHP设计模式---职责和单例模式

职责和单例模式

单例模式也认为是指责模式。
单例类至少拥有以下三种公共元素:
1、必须拥有一个构造函数,并且必须被标记为private
2、拥有一个保存类的实例的静态成员变量
3、拥有一个访问这个实例的公共的静态方法
 单例类只能被自身实例化,所以__construct()方法必须标记为private.


1、数据库连接职责的集中控制

 1 class Database{
 2  private $_db;          //构造对象时这个变量会被填充
 3  static $_instrance;    //保存类仅有的一个实例
 4  
 5  private function __construct(){    //只能被自身实例化,必须这样定义
 6   $this->_db=mysql_connect('localhost','root','mysql');  
 7   mysql_select_db('zzm',$this->_db);          
 8  }
 9  private function __clone(){}       //防止对象被复制或者克隆
10  
11       /**
12          此静态方法是单例模式的实际构造。此函数会检查静态实例变量是否已保存这个类的一个实例。
13        如果它没有包含自身的一个实例,类会被初始化并且保存到$_instance变量中。
14        下一次调用这段代码时,$_instance 变量会保存类的一个实例,并且这个类
15         不会在实例化。最后,这个方法会返回实例的应用。
16        **/
17  public static function getInserance(){
18   if(!(self::$_instrance instanceof  self)){
19    self::$_instrance=new self();
20   }
21   return self::$_instrance;
22  }
23  //使用$this->_db执行一个查询
24  public function query($sql){
25   return mysql_query($sql,$this->_db);
26  }
27 }
<?php 
// 使用单例类
$db=Database::getInserance();
$db->query('select * from users');
//说明:通过调用getinstance()方法,$db现在存有内部存储实例的应用。通过此实例可调用单例类中定义
的任何非静态方法
// 如果某个类不需要使用__construct方法,那么这个类就不太适合使用单例模式。
这样应使用纯静态类, 只需提供一个没有函数体的私有构造函数,并且去掉getInstance()和$_instance成员就可以做到这一点。
这会防止类被实例化,它通过消除使用这段代码时获得实例的可能性确保了单一职责性。

如下为纯静态类
class  SomeClass{
 //防止类被当作实例使用
 private function __construct(){}

 public static function SomeMethod(){
  //执行一些操作
 }
}
?>
posted @ 2012-07-02 11:54  祁连雪狼之家  阅读(184)  评论(0编辑  收藏  举报