您好,欢迎访问一九零五行业门户网

PHP 中实现 Factory 模式

有这么一种观点:似乎没有 “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 模式的内容。
其它类似信息

推荐信息