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;
?>

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/704.html