Bookmark and Share

Lee's 程序人生

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

Zend Framework 与设计模式 (六) - builder 建造者模式

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

当人们想用不同方法去实现同一种东西的时候,通常会想起 builder 建造者模式。比如一座大厦,设计图已经做好了,但是它可以由不同的工程师来指挥不同的建筑团队来完成,而最终得到的大厦则是一样的。

 

在这里不得不说一下 builder 建造者模式和 factory 工厂模式的区别。其实 factory 顾名思义,它提供各种产品,如电饭锅,微波炉等等,而 builder 则是提供成品,而且有多种途径,例如煮饭,我们可以用电饭锅,也可以用微波炉。

 

Zend Framework 中对 Zend_Feed 模块实现了 builder 建造者模式,使用户可以自行实现 feed 的内容定制 :

 

 

以下源代码经过简化 :

 

// builder 接口
interface Zend_Feed_Builder_Interface
{
    public function getHeader();
    public function getEntries();
}

 

Zend_Feed 提供的默认 builder : 

 

/**
 * @see Zend_Feed_Builder_Interface
 */

require_once 'Zend/Feed/Builder/Interface.php';

/**
 * @see Zend_Feed_Builder_Header
 */

require_once 'Zend/Feed/Builder/Header.php';

/**
 * @see Zend_Feed_Builder_Entry
 */

require_once 'Zend/Feed/Builder/Entry.php';

/**
 * Zend_Feed_Builder 实现了 Zend_Feed_Builder_Interface 接口
 * 通过 Zend_Feed_Builder_Interface 接口,用户可以自行实现 builder
 */

class Zend_Feed_Builder implements Zend_Feed_Builder_Interface
{
    private $_header;

    private $_entries = array();

    // ......

    public function __construct(array $data)
    {
        // ......
        $this->_header = new Zend_Feed_Builder_Header($data['title'], $data['link'],$data['charset']);

        foreach ($data as $row) {
            // ......
            $entry = new Zend_Feed_Builder_Entry($row['title'], $row['link'],$row['description']);
            $this->_entries[] = $entry;
        }
    }

    // Zend_Feed_Builder_Interface 接口函数
    public function getHeader()
    {
        return $this->_header;
    }

    // Zend_Feed_Builder_Interface 接口函数
    public function getEntries()
    {
        return $this->_entries;
    }

    // ......
}

 

需要再次强调的是,用户可以通过 Zend_Feed_Builder_Interface 很方便的实现自己的 builder 类。例如 : 

 

class My_Feed_Builder implements Zend_Feed_Builder_Interface
{
    public function getHeader()
    {
        return 'My Header!';
    }

    public function getEntries()
    {
        return 'My Entries!';
    }
}

 

接下来是 Zend_Feed_Abstract 虚拟类。在 Zend_Feed 模块的 builder 模式中,Zend_Feed_Abstract 充当 director 指导者的角色,负责选择及聚合用户提供的 builder ,并处理从 builder 得到的半成品,经过加工,得到最终成品。 

 

/**
 * Zend_Feed_Abstract 虚拟类
 */

abstract class Zend_Feed_Abstract extends Zend_Feed_Element implements Iterator
{
    // Header 和 Entries 由 $builder 提供
    public function __construct($uri = null, $string = null,Zend_Feed_Builder_Interface $builder = null)
    {
        // ......
        $this->_mapFeedHeaders($builder->getHeader());
        $this->_mapFeedEntries($builder->getEntries());
    }
}

 

实际例子是用数组生成的 feed 数据集 :

 

$data = array('author' => 'kim'
              'description' => 'my data');
 
// 使用默认 builder
require_once 'Zend/Feed/Builder.php';
$atom = new Zend_Feed_Atom(null, null, new Zend_Feed_Builder($data));
 
// 也可以使用自己的 builder
require_once 'My/Feed/Builder.php';
$myAtom = new Zend_Feed_Atom(null, null, new My_Feed_Builder($data));

 

Builder 建造者模式为用户提供了一种灵活的机制来处理对象和数据的生成,是应用程序可拓展性的保证。

转自:http://kbs.kimbs.cn/blog/list/post/18/title/builder-pattern-in-Zend-Framework 

我要啦免费统计