我是设计模式的新手。我觉得我在理解构建器模式方面缺少一些重要的部分。对象表示在这个定义中到底意味着什么?
构建器模式:将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示。
它是否意味着对象的内部结构(实例变量和成员函数)?我在互联网上查找过,但仍然感到困惑,感谢任何帮助!
根据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直到可以满足其所有组件依赖关系。