2016-04-26 9 views
0

2つの異なるクラスに多くのプロパティと1つの異なるプロパティがあるシナリオがあります。工場設計パターンを使用するにはどうしたらいいですか?使用しないでください。 これらのサブクラスの内部プライベートメソッドは、これらのプロパティを使用します。クライアントコードでファクトリメソッドの設計パターンに異なるパラメータを追加して、適切な設計を実現する方法

public class RunsValidator 
{ 
    //Few common properties 
    public int DataSegmentID { get; set; } 
    public int AttributeOffset { get; set; } 
} 

public class ProductAttributeRunValidator : RunsValidator 
{ 

    public ProductAttributeRunValidator(string productNames) 
    { 
     this.ProdNames = productNames; 
    } 
} 

public class CategoryAttributeRunValidator : RunsValidator 
{ 

    public CategoryAttributeRunValidator(int orgIDs) : base() 
      { 
      this.totalOrgIDs = orgIDs; 
      } 

} 

//ファクトリ実装

public class RunAttributeFactory 
{  

    public static RunsValidator GetRunValidator(string type, string productNames, int orgIds) 
    { 
     RunsValidator runValidator = null; 
     if(type == "Product") 
     { 
      runValidator = new ProductAttributeRunValidator(productNames); 
     } 
     else if (type == "Category") 
     { 
      runValidator = new CategoryAttributeRunValidator(orgIds); 
     } 
     else 
     { 
      runValidator = null; 
     } 
     return runValidator; 
    } 
} 

、私は、ファクトリメソッドへのパラメータ(productNames、orgIdsおよびタイプ)として送信されるべき変数へのアクセス権を持っています。私はクライアントコードの多くの場所で返されたrunValidatorにアクセスしたいと思います。タイプに基づいて一度だけ設定する必要があるからです。

これを達成する最も良い方法はどれですか?

+0

なぜあなたは工場をまったく使用していますか?なぜクライアントはオブジェクトコンストラクタを直接使用できないのですか? –

+0

ベースタイプにアクセスするたびに、以下のコードを複数削除したいと思います。それ以上の新しいサブタイプがある場合は、それらを容易に管理できるようにしたいので、if -elseロジックを1つの場所に保存しようとしています。 (type == "Product") (type == "Category") { runValidator = new CategoryAttributeRunValidator(orgIds); } } – user2555641

答えて

1

クライアントは、どのパラメータを渡すべきかを知るために出力のタイプを知っている必要があり、2つのタイプの間に再使用可能なコードがないことを考慮すると、「汎用」ファクトリパターンここに。私は2つのファクトリを持っています(いずれの型の場合でもにはのファクトリが必要です)、またはクライアントが直接型コンストラクタを呼び出させるようにします。

+0

私は元の質問に含まれていない基本的な方法を持っています。その共通メソッドは、サブクラスでこれらの異なるプロパティを使用する他のメソッドを内部的に呼び出します。 – user2555641

関連する問題