2016-05-07 5 views
0

私はデザインパターンについて研究しています。私はFactory Design PatternについてJavaで学びました。私はよく分からなかったことがいくつかあります。私はそれを次のように書いています。ファクトリメソッドデザインパターン「静的」修飾子が必要ですか

  1. FactoryデザインパターンとFactory Methodデザインパターンの間には違いがありますか?
  2. examples、Factoryクラスのgetメソッドがstatic、一部がexamplesで、それがstaticではないことがわかりました。正しい方法は何ですか?

助けていただければ幸いです。

+0

私にとって、この説明は最高でした。 http://stackoverflow.com/questions/13029261/design-patterns-factory-vs-factory -method-vs-abstract-factory –

+0

ファクトリは、オブジェクトの作成を目的としたクラスであり、1つまたは複数のファクトリメソッドを持つことができますが、ファクトリメソッドはファクトリクラス専用ではありません。ファクトリメソッドではないオブジェクトにファクトリメソッドを配置する主な理由は、このオブジェクトには作成プロセスを簡素化するいくつかの知識があるからです。たとえば、 'twoMinutes = oneMinute.plusMinutes(1);' – plalx

答えて

1

私は大量の本を多く抽象化して議論しているわけではないという意味でデザインパターンが深すぎるわけではありませんが、私は確かにそれらが何であるかを知り、それをどのように適用するかを知っています。ここではこれら二つのパターンの私の理解は次のとおりです。

  • Factoryはobjects.Thisが行くいくつかの利点を持つことができます他人を構築する方法を知っているオブジェクトを渡すことによって、オブジェクトのインスタンス化を遅らせるパターンです。たとえば、あなたがthetheプールライブラリを作成しているとしましょう。プールには特定のアクションを実行できるオブジェクトが含まれており、任意のサイズのプールを作成できます。プールの各オブジェクトは、別個のオブジェクトでなければなりません。プールのユーザーに、プール内で必要な数のオブジェクトを提供するように依頼できますが、オブジェクトを自分でインスタンス化するために使用する単一のファクトリを依頼することもできます。この方法では、プールのサイズを動的に変更したり、オブジェクトを破棄したり再生成したりすることもできます。プールが保持しているオブジェクトについて何も知らなくても、必要な柔軟性が得られます。

  • Factory methodは異なります。多くのパラメータを持つ大きなコンストラクタがあるとしましょう。これらのパラメータにはデフォルト値があるものもあれば、このクラスを構成するさまざまな方法があるものもあります。あなたは確かに各典型的な構成(パラメータのセット)のコンストラクタを追加することができますが、すべてのコンストラクタが同じ名前を共有するため、これはユーザーフレンドリーではありません。簡単にするために、コンストラクターを適切な構成で呼び出す静的メソッドを使用できます。利点は、これらのメソッドに名前を付けることができることです(defaultHttpClientForProddefaultHttpClientForDevなど)。別のユースケースは、大量のクラス階層を持っている場合です。例えば、抽象クラスCarが数十のクラスで拡張されています。あなたはそれぞれのコンストラクターを使って夢の車を作ることができますが、カタログのそれぞれのページを見て、どれを希望しているのかを判断する必要があります。代わりに、利用可能なすべての車を要約する単一のページを持つことができます。これは、多くのファクトリメソッドを含むクラスであり、より発見可能になります。

あなたの2番目の質問については、私はそれが依存すると言います。ファクトリをあまりカスタマイズしたり、コンテキストをたくさん注入したりする必要がない場合は、いくつかのパラメータを持つ静的メソッドがそのトリックを行います。あなたのファクトリをより設定しやすいようにするには、属性とインスタンスメソッドを持つクラスが良いでしょう。ご質問。具体的には

1

  1. 抽象工場&ファクトリメソッドは、二つの異なるデザインパターンです。詳細な説明はギャングオブフォー(デザインパターン)を参照してください。主な違いは、抽象工場や工場ファクトリメソッドは、オブジェクト1つの特定のタイプを作成するために、生成に関する方法を提供しているのに対し、は((オブジェクトの言葉ファミリー意味グループに注意してください)関連オブジェクトの家族の作成についてではないですファミリ)であり、複数のファクトリ実装クラスで実装できます。基本的に、ファクトリメソッドはファクトリまたはアブストラクトファクトリパターンの実装に使用されますが、その逆はできません。
  2. staticメソッドに関する限り、パターン自体は必須ではありません。これはJava &に固有のものであり、静的修飾子はFactoryのgetInstance()または任意の作成メソッドがシングルトンであることを確認するために使用されます。ファクトリの複数インスタンスを必要としないため、Javaではファクトリのインスタンスがstaticで実装されているため、staticインスタンスを返すにはstaticメソッドが必要です。
1

異なるチュートリアルは、工場設計パターンによって異なることを意味するように見えます。あなたのリンクにあるものは両方とも単純な工場だと私は言います。私はこの投稿が単純に違いを説明していると思います:Simple Factory vs. Factory Method vs. Abstract Factory 単純なファクトリは、静的メソッドを使用して、通常、ある種のif/elseまたはスイッチ構造を使って異なるサブクラスを作成することによって識別できます。 2番目のリンクの例では実際に静的メソッドを使用していませんが、静的メソッドをあまり変更することなく簡単に静的にすることができます。四本のギャングで

は、ファクトリメソッドパターンは次のように定義されます

オブジェクトを作成するためのインターフェイスを定義しますが、サブクラスがインスタンス化するクラスを を決めましょう。 Factoryメソッドでは、クラスがサブクラスに使用する インスタンス化を延期することができます。

サブクラスを使用するため、静的メソッドはオーバーライドできないため、ここでは機能しません。このようにしたシェイプの例は、次のようになります。

public interface ShapeFactory { 
    Shape getShape(); 
} 

public class CircleFactory implements ShapeFactory { 
    public Shape getShape() { 
     return new Circle(); 
    } 
} 

public class RectangleFactory implements ShapeFactory { 
    public Shape getShape() { 
     return new Rectangle(); 
    } 
} 

ShapeFactory shapeFactory = new CircleFactory(); 
... 
Shape shape = shapeFactory.getShape(); 

ここでは、工場の作成と使用方法を分けることができます。ファクトリはあるクラスで作成してから別のクラスに渡すことができるため、クラスは別のクラスによって構成されて異なるタイプのオブジェクトを作成できます。

やJava 8で、私たちは使用することができます。

Supplier<Shape> shapeFactory = Circle::new; 
... 
Shape shape = shapeFactory.get(); 
関連する問題