2010-12-06 6 views
10

私は非常に単純なファクトリを持っています。このファクトリは、作成するオブジェクトの型と作成されるすべてのオブジェクトに共通の他のパラメータを決定するパラメータの1つとしてEnumをとります。異なるパラメータを持つクラスのファクトリパターンを使用する

私は例えば、私のオブジェクトコンストラクタのパラメータを作成するための工場のためのより多くの種類が異なるために始めている追加しているとおり:

public class someFactory { 
    public someFactory() { 
    } 

    public SomeObject newObject(Type type, Object data) { 
     return this.newObject(type, data, ""); 
    } 

    public SomeObject newObject(Type type, Object data, Object stringOrObject) { 
     SomeObject someObject = null; 

     if (type != null) { 
      switch(type) { 
       case CREATE: 
        someObject = new CreateObject(data); 
        break; 
       case DELETE: 
        someObject = new DeleteObject(data, (String)stringOrObject); 
        break; 
       case EDIT: 
        someObject = new EditObject(data, (Object)stringOrObject); 
        break; 
       default: 
        break; 
      } 
     } 

     return someObject; 
    } 
} 

私は工場を使用して、ちょうどで、異なるタイプのインスタンスを作成してはいけませんまたは上記をより柔軟にするために何とか改良することができますか?

+1

Enumを削除して、代わりに別の方法を使用できますか? –

答えて

1

私はあなたが、その後、作成のためのこれらのIFactoriesの3のリストが含まれているファクトリクラスを持って削除し、編集し、これらの工場のリストを問い合わせることができ

public interface IFactory 
{ 
    SomeObject Create(Object data, String orObject); 
    Boolean AppliesTo(Type type); 
} 

のように見えるインターフェースを作成しますAppliesToメソッドに実際に応答する最初のものです。

+0

いいえ 'bool'sはここにあります:) – khachik

+1

笑、私のJavaは少し錆びている – Vadim

3

Javaの標準的なことは、列挙型にメソッドを追加することです。

@Stas Kurilinが指摘するように、あなたが列挙型を避け、ちょうど適切な名前とパラメータの静的作成メソッドを呼び出すことができるならば、あなたは多くの問題を解決
public enum Type { 
    CREATE() { 
     public SomeObject create(Object data, Object stringOrObject) { 
      return new CreateObject(data); 
     } 
    }, 
    [...]; 
    public SomeObject create(Object data) { 
     return create(data, ""); 
    } 
    public abstract SomeObject create(Object data, Object stringOrObject); 
} 

(他のいくつかのランダムな点:。。。それはnullまたは未知の値を受け入れるよりも、例外をスローするように、一般的にはましだというObjectより強い型付けを使用してみてください、このような大文字タイプ名などのJavaコーディング規約、とスティック)

0

、次のシグネチャとのインタフェースを作成します

public interface IFactory 
{ 
    GenricType Create(object data, string orObject); 

} 

と他のオブジェクトが、このインタフェースを実装してみましょう。その創造物がその対象物に残るように。工場のパターンは良いです。しかし、型を識別するために列挙型を使用しているので、多態性を使用する方が保守性が高くなります。

関連する問題