单件模式: 确保一个类只有一个实例,并提供一个全局访问点。
让类自己负责保存它的唯一实例。通过截取创建新对象的请求,保证没有其他的实例被创建。与此同时提供访问对象的方法。 (这里并不是说只能 new 一个类实例,而是保持一个类实例 )

昨天和同学聊天,他说PHP是草根语言。没错,PHP确实没有Java那种极难理解的概念或构架(学Python时,发现其实语言的概念类同,不过是看谁能够忽悠)。然像PHP和Py这样的脚本语言而言,草根也许更亲切(君不见红极一时的”模拟精灵”),后至今无缘深入Py。

为什么提上面的话,因为对于PHP5,单件模式远远没有Java那么复杂,当然功能深度也是不同的。[ Java版单件模式参考原书《Head First 设计模式》 ]

PHP5中的单件模式:

  1. 一个私有的静态属性;
  2. 私有的构造函数; (也有推荐析构函数也使用私有标示,但这样怎样销毁对象? 再来个 public 方法?)
  3. 一个公有的静态方法获取类的唯一实例; (在这个方法中判断和 new 对象,即使第一次实例对象也是调用它,除非你能攻破第2点)
  4. 防止用户克隆(__clone())类实例; (针对PHP中的克隆方法,不多说)

简单的php例子,还是巧克力锅炉那个例子…

/**
* 巧克力锅炉单件类
*
*/
class ChocolateBoiler {
/**
* 锅炉是否为空
*
* @var boolean
*/
private $empty;
private $boiled;

/**
* 保存对象实例
*
* @var ChocolateBoiler
*/
private static $instance = NULL;

/**
* 初始化巧克力锅炉 空的 没有熟
*
*/
private function __construct() {
$this->empty = true;
$this->boiled = false;
} //END func __construct

/**
* 私有的析构函数,
* 到底怎么销毁类对象
*/
//private function __destruct() {
//} //END func __destrauct

/**
* 静态共有方法,返回类对象
*
* @return ChocolateBoiler
*/
public static function getInstance() {
if (self::$instance == NULL) {
echo “new ChocolateBoiler.
“;
self::$instance = new ChocolateBoiler();
}
return self::$instance;
} //END func getInstance

/**
* 私有克隆函数,禁止克隆
*/
private function __clone() {
trigger_error(“Can’t be Cloned.”, E_USER_ERROR);
} //END func __clone

/**
* … … 其他方法 … …
*/
} //END class ChocolateBoiler

//获得单件对象,只有内部方法才能实例化对象(私有的构造方法)
$test1 = ChocolateBoiler::getInstance();
//$test1_clone = clone $test1; //禁止克隆