私は OOP の概念を理解しようとしてきましたが、ほとんどの概念の背後にある一般的なアイデアは理解できましたが、実際の実装に関するアドバイスが必要であることがよくあります。そのようなケースの 1 つがファクトリ メソッドです。
Web インターフェイスとコマンドライン インターフェイスの両方から受信するリクエストを処理する PHP アプリを作成しているので、両方のタイプのリクエストをカバーする次の単純なクラス継承構造を考え出しました。
abstract class Request {
}
class HttpRequest extends Request {
}
class CliRequest extends Request {
}
次に、によって返される値に応じて、具体的な Request インスタンスを返すファクトリ メソッドが必要ですphp_sapi_name()
。
public function create() {
if(php_sapi_name() === 'cli')
return new CliRequest();
else
return new HttpRequest();
}
私の質問は:どこに置くのですか?少なくとも 3 つの可能性が考えられます。
1)別のクラスの静的メソッド:
class RequestFactory {
public static function create() {
// ...
}
}
2)別のクラスの通常のメソッド (最初にクラスをインスタンス化する必要があります):
class RequestFactory {
public function create() {
// ...
}
}
3)抽象親クラスの静的メソッド:
abstract class Request {
public static function create() {
// ...
}
}
各ソリューションの長所と短所は何ですか?また、どれが「適切」と見なされますか?またその理由は何ですか?