Bookmark and Share

Lee's 程序人生

HTML CSS Javascript XML AJAX ATLAS C# C++ 数据结构 软件工程 设计模式 asp.net Java 数字图象处理 Sql 数据库
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

Zend Framework 与设计模式 (三) - factory 工厂模式

Posted on 2010-02-05 19:50  analyzer  阅读(622)  评论(0编辑  收藏  举报

工厂模式 - factory 是一个既简单又强大的设计方法,它可以帮助我们管理大量的代码,并且易于维护。

 

Factory - 工厂,顾名思义就是利用原料来生产产品,但是在这里我们所说的工厂模式,则是通过提供参数给生产者类 - producer ,来得到我们所需要的对象。实际上一个简单的有返回的函数 (function) 就是 factory 最简洁的表现形式。

 

下面我们将以 Zend_Cache 模块为例来看看 factory 的基本形式:

 

 

 

以下是经过简化的 Zend_Cache 源代码 : 

 

<?php
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 : 

 

<?php
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 

我要啦免费统计