<?PHP
/**
* 工廠模式
*
* 工廠模式有很多種變形,這裡只簡單舉個例子
*
* @author doodoo<pwtitle@gmai.com>
*/
/**
* 工廠接口
*/
interface Factory{
public static function getInstance();
/**
* 注冊類
*
* @param int $id 標志ID
* @param string $creator_func 構造方法,相當於工廠的加工方式
*/
public function registerClass($id, $creator_func);
/**
* 實例化具體類
*
* @param int $id 標志id
* @param array $args 傳遞給構造函數的參數
*/
public function createObject($id, $args);
}
/**
* 具體工廠,對接口的實現
*/
class MyFactory implements Factory {
private $registedClasses = array();
static public $instance = null;
private function __construct(){}
/**
* 單態生成類的實例,保證內存中只有一個工廠
*/
public static function getInstance(){
if(self::$instance==null){
self::$instance = new MyFactory();
}
return self::$instance;
}
public function registerClass($id, $creator_func){
$this->registedClasses[$id] = $creator_func;
}
public function createObject($id, $args){
if(!isset($this->registedClasses[$id])){
return null;
}
return $this->registedClasses[$id]($args);
}
}
/**
* 需要實例化的類,相當於要讓工廠加工的產品
*/
class MyClass{
private $created;
private $args;
public function __construct($args){
$this->args = $args;
$this->created = time();
}
public function getCreated(){
return $this->created;
}
}
/**
* 類實例化的具體方法
* 相當於告訴工廠使用什麼加工方式
* 這樣的加工方式就可以生成MyClass的實例了(產品)
*/
function MyClassCreator($args){
return new MyClass($args);
}
$factory = MyFactory::getInstance();
$factory->registerClass(1234,"MyClassCreator");
$instance = $factory->createObject(1234,array());
print_r($instance);
?>