PHP 工厂模式

时间:2009-10-14     作者:smarteng     分类: PHP相关


如果只是在使用中才包含,会给开发带来很大的麻烦。因为我不可能预先知道在哪个地方会使用到哪个类。而且,如果在每个页面中,根据需要进行require或include,这是令人很头疼的,我们往往会因为忘记include而导致一个warning或fatal。

如果在一个全局文件中包含所有的类库,然后所有的页面都包含这个全局文件。这样,虽然简化了include的工作,但是却带来了效率的下降。因为php会对每一个包含在内的文件进行检测。虽然PHP的效率很高,但是检测一大堆的类,还是会带来一些性能的下降的,特别是在一个大型系统中。

是不是有方法可以两全其美呢?答案即将揭晓~     :)

方法就是工厂模式。

工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。它定义一个用于创建对象的接口,由子类决定实例化哪一个类。
点击查看原图[break]

我们建立以下四个文件
index.php

<?php
include_once("f.inc.php");
$f=new factory;
$t1=&$f->create('T1');
echo $t1->getName();
echo $config;
?>
f.inc.php

<?php
class factory
{
 function factory()
 {
  $this->mClasses=array('T1'=>'t1.inc.php','T2'=>'t2.inc.php');
 }
 function &create($class)
 {
  if (!class_exists($class))
  {
   require_once($this->mClasses[$class]);
  }
  return new $class;
 }
}
?>
t1.inc.php

<?php
global $config;
$config='surfchen';
class T1
{
 var $mName='name::T1';
 function getName()
 {
  return $this->mName;
 }
}
?>
t2.inc.php

<?php
class T2
{
 function T2()
 {
  echo 't2 is ok';
 }
}
?>
在index.php里,我们通过一个factory类来创建其他的类实例。
在factory里,保存有一个数组$this->mClasses,格式为array(”类名”=>”类文件路径”).
我们通过factory::create()来创建一个类实例的时候,在create()里,会首先检测类是否存在,如果不存在,就根据$this->mClasses把类对应的类文件包含进来。然后创建并返回一个该类的实例。

这样,我们只需要把factory类文件包含进执行的脚本(如index.php)中就可以了。

大家可能还注意到了在t1.inc.php中的这两行代码。
global $config;
$config=’surfchen’;

为什么需要global呢?因为t1.inc.php是在factory::create中被包含的,t1文件中的变量将会默认为create的函数级变量。所以我们需要对其中的变量(如$config)进行global以便index.php能访问到。

运行index.php,将会输出
name::T1surfchen