菜鸟也玩PHP的工厂模式
分类:技术相关
PHP5发布之后就听说可以支持一定程度的OOP写法,由于对PHP了解有限,对这方面没有做过深入的研究。前段时间刚好有一个小项目在青蛙手上做,于是就拿来做实验(邪恶的笑几下),研究一下PHP中所谓OOP的写法,虽然自我感觉不尽完美,但总体来说也算是支持不错的了。
写在前面的话:
此次的试验结构是以M$ PetShop4.0为模型,相对于青蛙来说,这个结构应当是最有利于理解多层架构的,搭建之后的结构如图所示。

由于只是简单的示例,因此没有涉及数据库操作部分,而是采用模拟数据的方式来实现,青蛙认为这个不影响示例的理解,毕竟这部分不是重点。模拟的数据库如图所示。

注:青蛙为PHP的新手,文中提及的作法或说法对PHP有研究的人来说应当会很幼稚,笑笑之后还望指教一下不足之处,谢谢。
命名规则:
为了方便做说明,文件的命名方式采用“项目标识.文件夹名.类名+功能.php”为规则命名。
以下示例代码均摘自项目,在Vista Ultimate+Wamp2.0环境下正常运行。
先来介绍一下各个文件夹的作用。
BLL--这个应当是叫方法调用层,主要是用来将工厂返回的数据反映到调用层,以便页面调用时使用。
DAL--这个应当是叫数据操作层,主要是与数据库交互部分的功能。
DALFactory--数据工厂,反映工厂模式中接口与数据操作层的关系。
DBUtility--数据库操作对象/方法。
IFACE--顾名思义,就是接口层。
MODEL--属性层,在这里暂时用不上,原因后述。
简单的用流程图来反映如下所示,其中虚线部分为黑箱操作,以工厂为分界点。

当页面请求某个数据获取的时候,将启用BLL中相关的对象,如这里想获取用户信息,则先实例出一个用户的对象,如下代码所示:
1 2 3 4 | //实例化BLL对象 $user = new UserBLL(); //调用ID为1的用户记录 $userInfo = $user->GetUserDetail(1); |
其中UserBLL类有两个方法,一个是构造的方法,一个是获取用户详细信息的方法,类代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class UserBLL { private $user; //构造用户BLL对象 public function __construct(){ $dal = new UserFactory(); $this->user = $dal->Create(); } //这里故意将方法名称换了个,以确保GetUserProfile这个系统核心方法不被外界所知道。 public function GetUserDetail($id){ $userInfo = $this->user->GetUserProfile($id); return $userInfo; } } |
当用户实例了UserBLL这个类的时候,就会自动构造出Create的方法,工厂类代码如下所示:
1 2 3 4 5 6 7 | class UserFactory { public function Create(){ require 'DAL/U.DAL.UserDAL.php'; $create = new UserDAL(); return $create; } } |
这时,UserDAL已被工厂激活,当BLL中调用GetUserProfile的时候就会返回用户信息的数据对象,类代码如下所示:
1 2 3 4 5 6 7 | class UserDAL implements IUser { public function GetUserProfile($id){ $data = new UserData(); $profile = $data->UserData(); return $profile[$id - 1]; } } |
再回过头查看UserBLL类中的第二个方法GetUserDetail($id),这里事实上已经是调用到UserDAL中的GetUserProfile,并将数据返回到BLL层,而中间的处理层已经很好的将方法保护起来了,但结果并不影响,最终结果如下图所示。

这样整个流程就算是完成了。不过在试验的过程中,青蛙发现,在工厂中,理论上应当是调用接口返回的对象才对,但尝试调用接口的时候怎么试都无法成功,还望知情人能告诉青蛙,或者说在PHP中这方面的接口有缺陷?
附:对于属性层这里没有用上,主要是感觉使用之后定义的内容过多,而且似乎也用不上,还不如PHP自带的数组对象,因此这里屏弃不用。
附2:对于文中提到流程图为青蛙自己画的简单的流程图,仅表达个大概的思路,想更详细的了解请搜索“工厂模式 流程图”:D
附3:更加详细的工厂模式请参见:http://www.blueidea.com/tech/program/2008/5860.asp
帅青蛙
2009年11月04日
关键字:
还没有相关批示……