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