微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

我认为,使用Joshua Bloch here所述并讨论过over here的Builder是最好的方法

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

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,...);
 }
}

据我所知,构建器的内部工作原理是,通过使用构建器对象上的设置器,构建器本身处于状态且无法重复使用另一个对象,而无需先取消设置所有属性

例如在控制器中的用例看起来像这样:

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

一个人可能会在build()结束时拨打未设置的电话,但这对我来说有点不对劲,在我上面提到的消息来源以及我寻找这种构建器的实际实现中的任何地方(我住在Symfony中-land并查看FormBuilder)就像使用unset()一样。

Builder如何用于实例化多个不同的实例?

解决方法

我认为这里没有一个“正确”的答案,但是您有几个选择。

  • 为要构建的每个对象创建一个新的构建器,例如从工厂来的。
  • 添加您在构建器中提到的unset方法。
  • 每次build时重置构建器的内部状态。
  • 在您的构建器实现中添加流利的startOvernewInstance成员,从而提供一种清晰的方法来在呼叫站点指示“这是一个崭新的开始”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。