单例模式
单例模式保证类只有一个实例,并且自行实例化,并向整个系统提供这个实例
特点
- 这个类只能有一个实例;
- 必须自行创建这个实例;
- 必须向系统提供访这个实例的访问方法;
实现
class singleton{
private static $instance;
//防止外界实例化对象,构造函数为私有,不能被外面实例化
private function __construct(){
echo "this is __construct \n";
}
//防止外界克隆对象
private function __clone(){
}
public static function getInstance(){
if(empty(self::$instance)){
self::$instance = new singleton();//实例化
return self::$instance;
}else{
return self::$instance;
}
}
}
$test = singleton::getInstance();//直接调用类的静态方法
//$test2 = clone $test;//不能clone,因为__clone为私有
//new singleton();//不能实例化,因为构造函数__construct为私有
工厂方法
主要步骤:
- 定义一个抽象类(基类),定义一些抽象方法(接口规范)
- 继承该抽象类,实现抽象方法
- 定义工厂类,实例化对象
实现
//抽象类,基类
abstract class Cache_Abstract{
abstract public function getKey($key);
abstract public function setKey($key, $value);
}
//子类,集成抽象类
class File_Cache extends Cache_Abstract{
public function getKey($key){
//...
return $key;
}
public function setKey($key, $value){
//...
return $key;
}
}
class Apc_Cache extends Cache_Abstract{
public function getKey($key){
//...
return $key;
}
public function setKey($key, $value){
//...
return $key;
}
}
//工厂类
class Cache{
//根据需要,实例化相应的类
public function factory($strEngine='', $arrOptions=array()){
switch($strEngine){
case 'file':
$objEngine = new File_Cache($arrOptions);
break;
case 'apc':
$objEngine = new Apc_Cache($arrOptions);
break;
default:
$objEngine = new Apc_Cache($arrOptions);
break;
}
return $objEngine;
}
}