ファクトリはインターフェイスの実装を返すだけですか?それは仕事ですか?
5 に答える
ファクトリが行うのはそれだけの場合もありますが、次のこともできます。
実行時にのみ利用可能なデータに基づいて具体的な実装を選択します。
// Beverage Factory public IBeverage CreateBeverage(DateTime orderDate) { return orderDate.Hour > 12 ? new Beer() : new Milk(); }
構築後の初期化を実行します (多くの場合、高価な初期化またはオブジェクト自体にカプセル化するのに適していないデータの初期化)。
// Weather report factory public IWeatherReport CreateWeatherReport() { WeatherReport report = new WeatherReport(); report.data = WeatherWebService.GetData(); return report; }
既存のインスタンスに基づいて新しいインスタンスを初期化します。
// Fittest Algorithm Factory public Algorithm CreateNewAlgorithm() { return this.fittestAlgorithm.Clone(); }
インスタンスを最初から作成するのではなく、プールからインスタンスを作成します。
public IDbConnection CreateConnection(string connectionString) { return this.ConnectionStacks[connectionString].Pop(); }
シングルトン インスタンスを返します (ただし、スレッド セーフであることを確認する必要があります)。
ウィキペディアを参照してください。「インターフェースの実装を返す」という意味に応じて、そうです。ただし、この定義はあまり正確/包括的ではない場合があります(特に、ファクトリパターンは必ずしもインターフェイスの概念を必要としないため)。
ウィキから:
ファクトリ パターンの本質は、「オブジェクトを作成するためのインターフェイスを定義しますが、インスタンス化するクラスをサブクラスに決定させることです。ファクトリ メソッドを使用すると、クラスはインスタンス化をサブクラスに任せることができます。
本質的に、はい。
ただし、言語によっては、「インターフェース」に特定の意味がある場合があります。ファクトリは通常、一般的な契約の具体的な実装を返します。これは、インターフェイス、基本クラス、またはその他の特殊化の手段である可能性があります。
また、ファクトリが指定した正確な型を返す場合もありますが、ライフタイムの管理、追跡、または特殊な型の構築以外のその他の論理的根拠など、別の目的でファクトリを使用します。
これに関するさらに優れたリソースを結合します。
より具体的な答えは、ファクトリは、一般的なオブジェクトのタイプに対して事前初期化および事前構築作業を提供することです。これの最も単純な例 (私が見た) は、ハンマーが 2 つのオブジェクト (ハンドルとヘッド) で構成され、単一の名前が付けられた「ハンマー ファクトリー」です。したがって、私たちのファクトリは単一のメソッドを持つことができます:
(Hammer|IHammer|...) GetHammer(string hammername);
いくつかのオブジェクト (実際の Hammer オブジェクト、Hammer を記述するインターフェイス、Hammer の基本クラスなど) の 1 つを返すことができます。これらの中でおそらく最も役立つのは、ハンマーを記述し、そこから多くの有用な設計パターンを実装できるようにする Interface を返すことです。