2016-08-03 6 views
1

私はJavaの初心者です。私がそれを学ぶのに使う本は私を完全に混乱させる暗黙の例と文章があるようです。Javaインターフェイスのコンテキストでの「ファクトリメソッドデザインパターン」?

私は実際の世界でどのようなインターフェイスがどのように、そしてどのようにそのコンセプトを適用するのかを理解しています。しかし、ファクトリメソッドとは何ですか? 「ファクトリメソッド」という用語はあいまいです(JavaScriptはそれとは別の意味を持っています)ので、私の質問を明確にするために、本が持つスニペットを提供しています。コードは次のとおりです。

interface Service { 
    void method1(); 
    void method2(); 
} 

interface ServiceFactory { 
    Service getService(); 
} 

Serviceインターフェイスは単なる通常のインターフェイスです。 ServiceFactoryインターフェイスは通常のインターフェイスのように見えますが、「ファクトリメソッド」です。あれは何でしょう?それが何を解決し、なぜ私はそれらを使うべきですか?

+0

厳密に言えば、「ServiceFactory」も「通常の」インターフェースです。ファクトリメソッドは、ある種のインスタンス(つまり、 "factory"という用語)を生成(作成)する必要があるため、Java 8から始まって、ある種の実装が必要です。あなたはインターフェイスでファクトリメソッドを指定できますが、特定の型を作成する具象Factoryクラスが必要です。 https://en.wikipediaを参照してください。org/wiki/Factory_method_pattern –

+0

[デザインパターン:Factory vs Factoryメソッドと抽象ファクトリ]の重複している可能性があります(http://stackoverflow.com/questions/13029261/design-patterns-factory-vs-factory-method-vs-abstract- factory) – jaco0646

答えて

0

「ファクトリメソッド」は、オブジェクトを構築するメソッドです。

具体的には、この用語は通常、宣言するクラスのインスタンス(直接インスタンスまたはサブクラスのインスタンス)を返す静的メソッドを指します。

  • あなたが複数の異なるコンストラクタを持つ必要がある場合は、ファクトリメソッドを使用すると、あなたは彼らに適切な名前を付けることができます(別のコンストラクタの呼び出しだけで区別することができ、一方:私の経験では、それは特に、一般的に行われていますいくつかのケースがあります引数タイプは常に一目で分かりません)。
  • エントリポイントとして機能する1つの抽象クラスの実装をいくつか変更する必要がある場合、ファクトリメソッドは適切なサブタイプをインスタンス化できます。
  • キャッシュロジックや共有インスタンスが必要な場合は、ファクトリメソッドがそれを処理し、必要に応じて既存のインスタンスを返すことができます。
  • 副作用についていくつかの作業を行う必要がある場合は、ファクトリメソッドの名前を付けて、その副作用がより明確になるようにすることができます。

この例では、実際には「ファクトリメソッド」IMHOは含まれていませんが、ちょっと騙してgetService()と記述することができます。代わりにServiceFactoryを「工場」と記述します。ServiceFactory.getService()の利点は、ファクトリメソッドの場合と同じです。静的メソッドの代わりにインスタンスを持つというメリットがあります。

+1

静的ファクトリメソッドはGoFファクトリメソッドパターンと同じではありません。 2つは全く異なっています。 – jaco0646

+0

@ jaco0646:ああ、あなたは正しいです。 OPの例はいずれの例でもないようです。 – ruakh

+1

合意。 _factory_という用語は、作成方法を記述するために非常にゆるやかに使用されることがよくあります。この緩い用語はGoFや他の用語と融合し、混乱が生じます。 – jaco0646

1

ファクトリメソッドは、単にオブジェクトの作成を包み込むメソッドです。代わりにServiceの代わりにnew演算子を使用する代わりに、作成する場合は、いくつかのオブジェクトに対してファクトリメソッドを使用しています。

ServiceFactory sf = new ServiceFactoryImpl(); 
// factory method 
Service s = sf.getService(); 

代わりに、メソッドの役割を具体的に示すために、createServiceと呼びます。このメソッドは、Serviceの作成の詳細をカプセル化し、メソッドの多くの味(オーバーロードによる)を提供したり、コンテキストに応じて異なるサブクラスを返させたり、ファクトリメソッドに渡されるパラメータを返すことができます。

関連する問題