2012-03-02 7 views
1

以下の抽象メソッドの例を示します。ファクトリメソッドパターンの柔軟性を実現する方法

public interface Product { 
    public void draw();  
    public void move(); 
} 

public abstract class Creator {  
    public Product anOperation() { 
     Product product = factoryMethod(); 
     return product; 
    } 

    public abstract Product factoryMethod(); 
} 

public class ConcreateProduct1 implments Product { 
    public void draw() {   
    } 

    public void move(): 
    } 
} 

public class ConcreteCreator1 extends Creator { 
    public Product factoryMethod() { 
     return new ConcreateProduct1(); 
    } 
} 

public class Client { 
    public static void main(String arg[]) { 
     Creator creator = null; 
     creator = new ConcreteCreator1(); 
     creator.anOperation().move(); 
    } 
} 

これまでのところ、私は新製品を追加する柔軟性を知っていますが、ファクトリメソッドパターンの主な利点です。

以下の例では達成できない柔軟性をどのように実現するのか、誰でも説明できますか?一般的に

public class ConcreateProduct1 { 
    public void draw() {   
    } 

    public void move(): 
    } 
} 

public class Client { 
    public static void main(String arg[]) { 
     ConcreateProduct1 creator = new ConcreteCreator1(); 
     creator.move(); 
    } 
} 
+2

ここにタイプミスがあります。主な方法では、ConcreateProduct1 product1 =新しいConcreateProduct1()という意味ですか? – Pavan

答えて

1

あなたの例では、それはほとんど役に立たないのです。私は工場のパターンは決してが必要と思う:あなたはいつも同じようにいくつかの方法で行うことができますが、時には何らかの理由で使うのが便利です。例えば、プライベートコンストラクタと組み合わせてリソースの使用を制限するために使用することができます。キャッシュストラテジです。

また、反射コードと組み合わせると、もう1つ興味深い使い方があります。インターフェイスの具体的な実装を知らなくても、Factoryクラスを書くとしましょう。最も一般的な例はJDBC APIです。クライアントコードから、<driverId>:<params>のようなURLを介してデータベースにアクセスします。工場は、それは彼らがdinamically(に登録してインスタンス化されるため、工場出荷時のベンダーは、新しいドライバを追加するための実装を変更する必要はありません。このコード

Class driverClass = drivers.get(driverId); 
Constructor constructor = driverClass.getDeclaredConstructor(); 
return constructor.newInstance(params); 

<driverId>に基づいて正しい型のインスタンスを作成することができ​​を持っていますjdbcこれはClass.forName("com.example.Driver")経由で発生します)。これはまだ不必要な複雑さのように思えます:なぜあなたは知っておく必要があるのistanceを得るために工場を使用?この場合、明らかに有利な点は柔軟性です。ドライバ名は、(例えば構成ファイルなどで)外部化できる文字列です。このようにして、最後のユーザ(開発者ではない)は、アプリケーションを再コンパイルせずにドライバを切り替えることができます。

+0

ありがとうあなたのJDBCの例は良いです。 – chetan

1

とき、工場は便利です:あなたは、オブジェクトの構成が複雑であり、あなたがそれを広めたくない

  • 一定の基準に基づいて、インタフェースの異なる実装が必要

    • あらゆる場所で、代わりに1つの場所にローカライズします。

    1の例:お使いの場合には

    、クライアントコードは、ちょうどこの場合

    Product p = Creator.create(Some_Critera); 
    

    を言うだろう、あなただけの製品を持っています。工場は基準に基づいてどのような実施を決定するか。 2の

    例:

    製品が注入される3つの異なるオブジェクトを必要としましょう。この場合、あなたが行うすべての場所:

    オブジェクトの生成方法が重複しています。もちろん、IDEを使用すると、メソッドの変更署名を簡単に行うことができ、変更が必要なときはいつでもそれを使用できます。

    ただし、すべてのクライアントは、彼らがSomeFancyProductを必要なときDEP1DEP2などを持っている必要があります。その代わり、DEP2などだけクリエーターは、これらの3つのオブジェクトに依存関係を持つことができ、クライアントは、このように、クライアントとDEP1の間の任意の結合を持っていない不可知論することができ、

  • 関連する問題