現在、抽象ファクトリを使用して、リクエスト オブジェクトを生成するためのカスタム クラス名を指定できるようにしています。これを行う理由は、コードを変更せずにコア機能を簡単に拡張できるようにするためです。しかし最近、私はこのアプローチの有効性について疑問を持っています. だから私の質問はこれです:
ファクトリが、予想されるインターフェイスに一致する送信されたクラス名をインスタンス化できるようにすることは、ファクトリの概念のろくでなし化ですか? これを避けるために、私はより良いサービスを受けることができますか?
アップデート
ここでの論理は次のとおりです。一方で、実際の自動車工場 (たとえば) は、その種の車を製造するための機械を備えていなければ、自動車を製造することはできません。一方、以下のコードは、同じ自動車工場に、本来意図されていなかったカスタムカーを作るための設計図を与えるようなものです。
別の方法は、ファクトリで使用できるカスタム クラス名を指定する構成オブジェクトを渡し、ファクトリが構成で指定されたカスタム クラス名と明確に一致する場合にのみカスタム クラスを生成するように制限することです。何かご意見は?
そして、関連するコード...
<?php
interface AbstractRequestFactory
{
public function buildRequest($type);
}
class RequestFactory implements AbstractRequestFactory
{
public function buildRequest($type='http')
{
if ($type == 'http') {
return new HttpRequest();
} elseif ($type == 'cli') {
return new CliRequest();
} elseif ($custom = $this->makeCustom($type)){
return $custom;
} else {
throw new Exception("Invalid request type: $type");
}
}
protected function makeCustom($type)
{
if (class_exists($type, FALSE)) {
$custom = new $type;
return $custom instanceof RequestInterface ? $custom : FALSE;
} else {
return FALSE;
}
}
}
// so using the factory to create a custom request would look like this:
class SpecialRequest implements RequestInterface {}
$factory = new RequestFactory();
$request = $factory->buildRequest('\SpecialRequest');