* factory 模式
*
* factory 的概念不像 Singleton 等模式那样, factory 模式比较
* 灵活。通常根据不同的要求能够"生产不同对象"(实例化类)就可以
* 归为 factory 模式或者其变体。
*//**
* 先用手册中一个简单的例子说明 factory 模式
*
* 注意下面这段代码并不可执行,因为需要定义相应的数据库[Driver]类。
*/classDbFactory{// factory 方法publicstaticfunctionfactory($type){// 注意这里的包含文件应该是相关数据库的[Driver]类if(include_once‘Drivers/‘.$type.‘.php‘){$classname=‘Driver_‘.$type;returnnew$classname;}else{thrownewException(‘Driver not found‘);}}}// 生成数据库(MySQL)连接对象,$DbCon=DbFactory::factory(‘MySQL‘);// $DbCon = DbFactory::factory(‘SQLite’);/**
* "Core PHP Programming" 中的例子
*/classFactory{private$registeredClasses=array();staticprivate$instance=NULL;privatefunction__construct(){}staticfunctiongetInstance(){if(self::$instance==NULL){self::$instance=newFactory();}returnself::$instance;}functionregisterClass($id,$creator_func){$this->registeredClasses[$id]=$creator_func;}functioncreateObject($id,$args){if(!isset($this->registeredClasses[$id])){return(NULL);}return($this->registeredClasses[$id]($args));}}classMyClass{private$created;publicfunction__construct(){$created=time();}publicfunctiongetCreated(){return($this->created);}}functionMyClassCreator(){return(newMyClass());}$factory=Factory::getInstance();$factory->registerClass(1234,"MyClassCreator");$instance=$factory->createObject(1234,array());/**
* "PHP 5 Power Programming" 中的对 factory 模式的诠释
*
* 一个 Factory 类通常都有一个方法负责接受参数,根据参数的不同来决定
* "生产"哪个类的实例。下面拿网站的用户作为例子,作为实际运用:把网站
* 用户分成匿名用户,普通(注册)用户,管理员。我们在类中进行用户的权限
* 控制—这样能够更好的展现 factory 类在整个类体系中所扮演的角色。
*//**
* 基类 User
*/abstractclassUser{public$name=null;publicfunction__construct($name){$this->name=$name;}functiongetName(){return$this->name;}// 权限控制方法functionhasReadPermission(){returntrue;}functionhasModifyPermission(){returnfalse;}functionhasDeletePermission(){returnfalse;}}// 匿名用户类classGuestUserextendsUser{}// 注册用户类classCustomerUserextendsUser{functionhasModifyPermission(){returntrue;}}// 管理员类classAdminUserextendsUser{functionhasModifyPermission(){returntrue;}functionhasDeletePermission(){returntrue;}}/**
* 用户 factory 类
*/classUserFactory{privatestatic$users=array("Andi"=>"admin","Hick"=>"guest","Derick"=>"customer");staticfunctionCreate($name){if(!isset(self::$users[$name])){// 如果不存在对应的用户类,则提示错误}switch(self::$users[$name]){case"guest":returnnewGuestUser($name);case"customer":returnnewCustomerUser($name);case"admin":returnnewAdminUser($name);default:// 默认应该报错}}}// 使用 factory 类实例化用户$HickUser=UserFactory::Create(‘Hick‘);echo$HickUser->name;?>