工厂并发访问
Factory concurrent access
当编码工厂时,我总是做一件事:
final class FooFactory implements FooFactoryInterface
{
/**
* @var array<string=>mixed> - constructor argument names to values
*/
private array $constructorArguments = [];
public function withBar(BarInterface $bar): static
{
$factory = clone $this;
$factory->constructorArguments['bar'] = $bar;
return $factory;
}
}
在调用工厂的方法时(也可能是为了实体水化),我总是把它添加到一个新的工厂中以避免并发访问,总是这样做是安全的,但是问题会发生吗?
是否所有客户端都使用同一个工厂,即内存中的对象?
我倾向于说每个请求都会触发所有对象的创建,然后这些对象会被销毁,但我不能 100% 确定非克隆版本是安全的。
使用 void return 类型有助于代码理解,在 C 函数中 return 使用相同的字符串作为参数会造成混淆,如果可以避免流畅的模式,我会采用它。
另外,接口不能强制执行,必须完成才能获得实现 class 给出的工厂的新状态,这对我来说是个问题,接口应该说明一切。
那么,克隆还是不克隆?这就是设计问题。
每个请求都由 PHP FPM 进程的一个线程处理,但对象仅独立存在,不在线程之间共享。
我会说没有必要克隆...
当编码工厂时,我总是做一件事:
final class FooFactory implements FooFactoryInterface
{
/**
* @var array<string=>mixed> - constructor argument names to values
*/
private array $constructorArguments = [];
public function withBar(BarInterface $bar): static
{
$factory = clone $this;
$factory->constructorArguments['bar'] = $bar;
return $factory;
}
}
在调用工厂的方法时(也可能是为了实体水化),我总是把它添加到一个新的工厂中以避免并发访问,总是这样做是安全的,但是问题会发生吗?
是否所有客户端都使用同一个工厂,即内存中的对象? 我倾向于说每个请求都会触发所有对象的创建,然后这些对象会被销毁,但我不能 100% 确定非克隆版本是安全的。
使用 void return 类型有助于代码理解,在 C 函数中 return 使用相同的字符串作为参数会造成混淆,如果可以避免流畅的模式,我会采用它。 另外,接口不能强制执行,必须完成才能获得实现 class 给出的工厂的新状态,这对我来说是个问题,接口应该说明一切。
那么,克隆还是不克隆?这就是设计问题。
每个请求都由 PHP FPM 进程的一个线程处理,但对象仅独立存在,不在线程之间共享。
我会说没有必要克隆...