当人们想用不同方法去实现同一种东西的时候,通常会想起 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 类。例如 :
{
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