单例模式

单例模式保证类只有一个实例,并且自行实例化,并向整个系统提供这个实例

特点

  1. 这个类只能有一个实例;
  2. 必须自行创建这个实例;
  3. 必须向系统提供访这个实例的访问方法;

实现

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为私有

工厂方法

主要步骤:

  1. 定义一个抽象类(基类),定义一些抽象方法(接口规范)
  2. 继承该抽象类,实现抽象方法
  3. 定义工厂类,实例化对象

实现

//抽象类,基类
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;
	}
}