1. 杨乐多博客首页
  2. 技术杂谈
  3. PHP

PHP设计模式之:建造者模式

建造者设计模式定义了处理其他对象的复杂构建的对象设计。
假如项目包含一个创建复杂产品对象的类,这个类包含完整构成对象的3个方法如:setType()、setColor()、setSize()。
传统设计方式为先创建产品对象,然后再执行上述3个方法,如下代码:

<?php
class product
{
    protected $_type = '';
    protected $_size = '';
    protected $_color = '';

    public function setType($type)
    {
        $this->_type = $type;
    }

    public function setSize($size)
    {
        $this->_size = $size;
    }

    public function setColor($color)
    {
        $this->_color = $color;
    }
}

为了创建完整的产品对象,需要将产品配置信息分别传递给产品类的每个方法

<?php
$productConfigs = array('type'=>'shirt', 'size'=>'xl', 'color'=>'red');

$product = new product();
$product->setType($productConfigs['type']);
$product->setSize($productConfigs['size']);
$product->setColor($productConfigs['color']);

创建对象时,分别调用每个方法并不是最佳的做法,此时,我们最好使用基于建造者设计模式的对象来创建这个产品的实例。
productBuilder类被设计为接受构建product对象所需的这些配置选项。它不仅存储配置参数,而且存储一个实例化的新product实例。
build方法负责调用product类中的所有方法,从而构建完整的product对象。最后,getProduct方法返回完整构建的product对象。

<?php
class productBuilder
{
    protected $_product = NULL;
    protected $_configs = array();

    public function __construct($configs)
    {
        $this->_product = new product();
        $this->_configs = $configs;
    }

    public function build()
    {
        $this->_product->setType($this->_configs['type']);
        $this->_product->setSize($this->_configs['size']);
        $this->_product->setColor($this->_configs['color']);
    }

    public function getProduct()
    {
        return $this->_product;
    }
}

上述代码中,build方法隐藏了来自请求新product对象的代码的实际方法调用。如果product类以后发生改变,那么只需要修改productBuilder类中build方法。
下面的代码说明了如何使用productBuilder类创建product对象。

<?php
$productConfigs = array('type'=>'shirt', 'size'=>'xl', 'color'=>'red');

$builder = new productBuilder($productConfigs);
$builder->build();
$result = $builder->getProduct();
print_r($result);
<?php
//运行结果
product Object
(
    [_type:protected] => shirt
    [_size:protected] => xl
    [_color:protected] => red
)

建造者设计模式的目的是消除其他对象的复杂创建过程。使用建造者设计模式不仅是最佳的做法,而且在某个对象的构造和配置方法改变时可以尽可能地减少重复更改代码。

原创文章,作者:iConan,如若转载,请注明出处:https://www.aspyc.com/archives/640.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据