php的factory,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 模式的内容,更多相关内容请关注PHP中文网(www.php.cn)!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值