构建器模式中的对象表示到底意味着什么?

ooO*_*lly 5 design-patterns

我是设计模式的新手。我觉得我在理解构建器模式方面缺少一些重要的部分。对象表示在这个定义中到底意味着什么?

构建器模式:将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示。

它是否意味着对象的内部结构(实例变量和成员函数)?我在互联网上查找过,但仍然感到困惑,感谢任何帮助!

Hen*_*los 0

根据GoF 的说法,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!
Run Code Online (Sandbox Code Playgroud)

那么,回答你的问题:

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

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

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

但作为一项智力练习,想一想如果某些组件有自己的依赖项,而这些依赖项无法以正确的方式获得,会发生什么情况。然后,您将能够延迟对象,CarImpl直到可以满足其所有组件依赖关系。