2012-02-17 7 views
1

Staffオブジェクトをさまざまな方法で取得するStaffFactoryがありますが、使用するデータソースを決定するための設定メソッドもあります。ファクトリクラスを管理するための基本クラス

class StaffFactory 
{ 
    private const string DefaultDbSourceName = "Production"; 
    private string dbSourceName; 
    #region Factory Management 
    private static Dictionary<string, StaffFactory> staffFactories = new Dictionary<string,StaffFactory>(); 
    public static StaffFactory GetInstance() 
    { 
     return GetInstance(DefaultDbSourceName); 
    } 
    public static StaffFactory GetInstance(string dbSourceName) 
    { 
     if (!staffFactories.ContainsKey(dbSourceName)) 
     { 
      staffFactories.Add(dbSourceName, new StaffFactory(dbSourceName)); 
     } 
     return staffFactories[dbSourceName]; 
    } 
    private StaffFactory(string dbSourceName) 
    { 
     this.dbSourceName = dbSourceName; 
    } 
    #endregion Factory Management 
    #region Factory Methods 
    public Staff ById(int id) { ... } 
    public IList<Staff> ByName(string name) { ... } 
    ... 
    #endregion Factory Methods 
} 

私は私の次のファクトリを作成するために行くように、私はこのすべて管理ロジックに関係なくのためである工場を入力するものと同じままになるだろう実現。だから私は、その論理を収めている基本的なFactoryまたはFactoryクラスを作成してから、上記の宣言をclass StaffFactory : Factory<Staff> { ... }または何かで宣言していると思っていますが、私はそれについてどのようにすればよいかについて完全な空白を描いています。ジェネリックなどを使って実装するかどうか。

誰かが正しい方向に向いていますか?

+0

Factory、Singelton、Repositoryを実装しようとしていますか? –

答えて

2

新しい抽象レイヤーを導入する前に、メリットがコストを上回ることを確認してください。あなたのケースでは、それらが含まれます:

抽象化を設計し、実装するためのコスト

をStaffFactoryは、一般的な工場<T>クラスよりも、設計、実装、テストする方がはるかに簡単です。

コスト

は毎回誰かがコードを読み取る工場<T>抽象

を理解するために、彼らは抽象化の周りに自分の頭をラップする必要があるかもしれません。ジェネリックな抽象化は、非ジェネリックな抽象化よりも頭を包み込むのが難しいです。将来の変化

を作るために

費用はあなたが工場<スタッフ>と工場<製品>を持っており、将来的にあなたが2で異なるキャッシュポリシーを望むことを見つけることを言ってみましょう。ファクトリ<Product>は、キャッシュサイズがあるしきい値を超えた場合に、キャッシュされたオブジェクトを破棄する必要があります。

ファクトリ< >クラスを異なるモードに対応させるために一般化しようとしていますか?これは可能ですが、StaffFactoryクラスとProductFactoryクラスを個別に変更するよりもはるかに複雑です。

概要

ので、ちょうどそれのために抽象化を導入していません。ファクトリ< >の場合は、<スタッフ>が唯一の汎用インスタンシエーションになるはずです。

あなたのコードからは、工場<T>クラスは、基本的には<という文字列、T >のように見えます。その場合、追加の汎用Factoryクラスを導入しても、多くのメリットは得られず、不要な抽象レイヤーだけが追加されます。

+0

洞察に感謝します。私は、工場クラスは辞書<タイプ、辞書>だろうと思いますか? –

0

あなたが実装しようとしていることがわかっているのは、リポジトリパターンです。 Repository pattern tutorial in C#への回答を参照してください。

関連する問題