工厂模式 - factory 是一个既简单又强大的设计方法,它可以帮助我们管理大量的代码,并且易于维护。
Factory - 工厂,顾名思义就是利用原料来生产产品,但是在这里我们所说的工厂模式,则是通过提供参数给生产者类 - producer ,来得到我们所需要的对象。实际上一个简单的有返回的函数 (function) 就是 factory 最简洁的表现形式。
下面我们将以 Zend_Cache 模块为例来看看 factory 的基本形式:
以下是经过简化的 Zend_Cache 源代码 :
abstract class Zend_Cache
{
// 标准缓存前端
public static $standardFrontends = array([...]);
// 标准缓存后端
public static $standardBackends = array([...]);
// 标准拓展缓存后端
public static $standardExtendedBackends = array([...]);
// ......
/**
* Factory 工厂
*
* @param mixed $frontend frontend name (string) or Zend_Cache_Frontend_ object
* @param mixed $backend backend name (string) or Zend_Cache_Backend_ object
* @return Zend_Cache_Core|Zend_Cache_Frontend
*/
public static function factory($frontend, $backend, [...])
{
//......
$backendClass = 'Zend_Cache_Backend_' . $backend;
$backendObject = new backendClass;
$frontendClass = 'Zend_Cache_Frontend_' . $frontend;
$frontendObject = new frontendClass;
$frontendObject->setBackend($backendObject);
return $frontendObject;
}
// ......
}
值得注意的是,Zend_Cache 是一个虚拟类 (abstract class),这代表我们不能实例化或者直接调用它,而只能是根据需要,通过它的 factory 方法来获取所需对象,这是防止滥用工厂的有效机制。
其次我们看到一堆预定义的 static 变量,如 $standardFrontends 等等。对于这些东西我们可以理解为成产品标准以及质量标准,是用来衡量产品是否合格的指标。这些指标将在生产的过程中被调用,是全局的,可控的且易于修改的。
Zend_Cache 的"产品"列表如下图 :
其中所有 Zend_Cache_Frontend_Xxx 都继承自 Zend_Cache_Core :
class Zend_Cache_Core
{
}
class Zend_Cache_Frontend_Output extends Zend_Cache_Core
{
}
class Zend_Cache_Frontend_Function extends Zend_Cache_Core
{
}
class Zend_Cache_Frontend_File extends Zend_Cache_Core
{
}
class Zend_Cache_Frontend_Class extends Zend_Cache_Core
{
}
class Zend_Cache_Frontend_Page extends Zend_Cache_Core
{
}
我们在程序中通过执行类似以下代码来获取所需对象:
// 选择一个后端 (例如 'File', 'Sqlite'...) $backendName = '[...]'; // 选择一个前端 (例如 'Core', 'Output', 'Page'...) $frontendName = '[...]'; // 为选择的前端设置一个选项数组 $frontendOptions = array([...]); // 为选择的后端设置一个选项数组 $backendOptions = array([...]); // 创建实例 (当然,最后两个参数是可选的) $cache = Zend_Cache::factory($frontendName, $backendName, $frontendOptions, $backendOptions);
以上只是一个简单的例子。其实如果仔细阅读一下 Zend Framework 源代码,你会发现 factory 工厂无处不在。可以说,factory 正是维护框架的强力保证。
转自:http://kbs.kimbs.cn/blog/list/post/11/title/factory-pattern-in-Zend-Framework