有這麼一種觀點:似乎沒有 “Factory 模式”一說,GoF 的 23 個模式中與 Factory 相關的有兩個:Factory Method 和 Abstract Factory ,《深入淺出設計模式》中則定義了一個 Simple Factory 模式。而本人(Hick) 翻閱了一下相關資料,Robert C. Martin 的《Agile Software Development: Principles, Patterns, and Pracitces》直接提的是「Factory 模式」。具體情況有興趣的可以去詳細考證。
“Factory 模式允許我們之依賴於抽象介面就能夠創建出具體物件的實例”,是 DIP (依賴倒置原則)的體現。我們能夠透過給一個工廠(factory)不同的需求來生產不同但是相似的產品(實例化物件)。
嘿嘿,人說,最好的文檔就是程式碼。我不僅僅這樣說,我還可以證明給你看(在這裡的顯示效果不好,建議拷貝到PHP編輯器中看),下面分別是《PHP 手冊》、《Core PHP Programming》和《PHP 5 Power Programming》中Factory 模式的實例解析:
<?php /** * 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; ?>
以上就是PHP 中實現Factory 模式的內容,更多相關內容請關注PHP中文網(www.php.cn)!