生成器如何用于实例化多个不同的实例



我想在代码中实例化多个(即相同类型(不同(即不同的属性组合(复杂(即许多可选参数(对象。

我认为使用Joshua Bloch在这里描述并在这里讨论的生成器是最好的方法。

一个非常基本的实现如下所示:

class ObjectBuilder implements ObjectBuilderInterface
{
public function setAttributeA( $value ) : self
{
$this->attributeA = $value;
return $this;
}
public function setAttributeB( $value ) : self
{
$this->attributeB = $value;
return $this;
}
.
.
.
public function build() : Object
{
return new Object ($this->attributeA, $this->attributeB,...);
}
}

但是就我对构建器的内部工作原理的理解而言,通过在构建器对象上使用setter,构建器本身具有一个状态,如果不首先取消设置所有属性,就无法对另一个对象重用。

例如,控制器中的一个用例看起来像这样:

public function FooController (ObjectBuilderInterface $builder, ...)
{
$builder
->setAttributeA('A')
->setAttributeB('B');
$instance1 = $builder->build();

$builder
->setAttributeA('C')
->setAttributeB('D');
$instance2 = $builder->build();
}

一个人可以在build()结束时发出一个未设置的调用,但这对我来说有点错误,在我上面提到的来源中,以及在我寻找这样一个构建器的真实实现的任何地方(例如,我住在Symfony的土地上,曾研究过FormBuilder(都像使用的unset()

生成器如何用于实例化多个不同的实例?

我不认为有"右";在这里回答,但你有几个选择。

  • 为您打算构建的每个对象创建一个新的构建器,例如从工厂构建
  • 添加您在生成器中提到的unset方法
  • 每次build时重置生成器的内部状态
  • 将流畅的startOvernewInstance成员添加到您的构建器实现中,提供了一种明确的方式来指示";这是一个全新的开始;在呼叫站点

最新更新