我是设计模式的新手。我觉得我在理解Builder Pattern时缺少一些必要的部分。 对象表示在这个定义中的确切含义是什么?
构建器模式:分离复杂对象的构造 从它的表示,以便相同的施工过程可以 创造不同的表现形式。
是否意味着对象的内部结构(实例变量和成员函数)? 我在互联网上寻找但仍然混淆它,任何帮助表示赞赏!
答案 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已解决您对术语的关注
抽象只是外部代码的可见部分。它是提供者和客户代码之间的合同。 [...]
代表是解决问题的方式。它遵循提供输入和预期返回的合同。 [...]
我很想用简单的说法,说抽象与接口有关,而表示与实际实现有关。
引号中的[...]
是我的,表示我省略了不太重要的部分。