听蛙居 – 帅青蛙的工作与生活

林莺啼到无声处,青草池塘独听蛙……

菜鸟也玩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日

关键字:, ,


本博客内容大部分属于原创,若需转载请注明出处。商业用途请与我联系

还没有相关批示……

我来批示

1531811292045171967128131016114

随机显示的5篇日志

批示最多的5篇日志

©2009 听蛙居 – 帅青蛙的工作与生活版权所有
Powered by Wordpress. 感谢huangna提供空间 & 感谢Mojojo提供设计。