构建器模式中的对象表示究竟意味着什么

时间:2015-06-08 18:33:19

标签: design-patterns

我是设计模式的新手。我觉得我在理解Builder Pattern时缺少一些必要的部分。 对象表示在这个定义中的确切含义是什么?

  

构建器模式:分离复杂对象的构造   从它的表示,以便相同的施工过程可以   创造不同的表现形式。

是否意味着对象的内部结构(实例变量和成员函数)? 我在互联网上寻找但仍然混淆它,任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

根据GoF,Builder模式是creational模式,因此,当您需要创建对象时,它可以解决特定问题。

当您需要创建具有许多依赖项的复杂对象时,需要使用Builder模式,并且同时获取所有这些依赖项是不可能或不切实际的。

让我们以汽车装配线为例。不是所有的汽车都是相同的,所有的汽车都有相似的结构(如车架,车轮,方向盘,刹车,灯),它们的选项可能不同,如数字空调,太阳能屋顶,停车摄像头等等

这条装配线应该足够灵活,能够以最小的设置制造出客户想要的任何配置的汽车。

让我们想象一下,装配机收到了必须装配的新车的蓝图,然后遵循该规范。

将这一点带到面向对象的软件工程领域,我们可能会:

interface ICar {
    public function getName();
    public function getColor();
    public function addComponent($component);
}

class CarImpl implements ICar {
    private $name, $color, $components = array();
    public function __construct($name, $color, array $components){
        $this->name = $name;
        $this->color = $color;
        $this->components = $components;
    }
    public function getName() { return $this->name; }
    public function getColor() { return $this->color; }
    public function addComponent($component) { $this->components[] = $component; }
}

class CarBuilder {
    private $buildClass = 'CarImpl';
    private $name, $color, $components = array();

    public function __construct($buildClass = null) {
        if ($buildClass !== null) {
            $this->buildClass = $buildClass;
        }
    }

    public function setName($name) {
        $this->name = $name;
    }

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

    public function addComponent($component) {
        $this->components[] = $component;
    }

    public function build() {
        return new ${this->buildClass}($this->name, $this->color, $this->components);
    }
}

// using...

$builder = new CarBuilder();
$builder->setName('Camaro');
$builder->setColor('Yellow');
$builder->addComponent('frame');
$builder->addComponent('bodywork');
$builder->addComponent('wheels');
$builder->addComponent('engine');
$builder->addComponent('black stripes');
$builder->addComponent('cybertronian core');

$myCar = $builder->build(); // yields Bumblebee!

所以,回答你的问题:

  

是否意味着对象的内部结构(实例变量和成员函数)?

是的,它指的是内部结构。通常,是一个实例变量,因为在PHP中通过向其添加方法来更改类合同不是一个好习惯。

虽然上面的例子看起来很愚蠢但我为了简单起见故意这样做。

但是,作为一项心理练习,想想如果某些组件有自己的依赖关系无法正确获得会发生什么。然后,您就可以延迟CarImpl对象,直到您可以完全填充其所有组件依赖项。

答案 1 :(得分:0)

设计模式的索引部分中寻找引用似乎没有答案。

幸运的是,in this Wikibooks appendix已解决您对术语的关注

  
      
  • 抽象只是外部代码的可见部分。它是提供者和客户代码之间的合同。 [...]

  •   
  • 代表是解决问题的方式。它遵循提供输入和预期返回的合同。 [...]

  •   

我很想用简单的说法,说抽象与接口有关,而表示与实际实现有关。

引号中的[...]是我的,表示我省略了不太重要的部分。