<?php /** * 工厂模式 * * 工厂模式有很多种变形,这里只简单举个例子 * * @author doodoo<[email protected]> */
/** * 工厂接口 */ 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); ?> 
|