2012-02-17 49 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 
} 

当我去创造我的下一个工厂,我知道这一切的管理逻辑是要保持相同的,不管是什么类型的工厂是。所以我认为我创建了一些基本的工厂或工厂类,它包含了逻辑,然后我用class StaffFactory : Factory<Staff> { ... }或者其他的东西来声明上面的内容,但是我对如何去做这件事表示完全空白。是否使用泛型等实现它

任何人都可以指向正确的方向吗?

+0

你想要实现一个Factory,Singelton或Repository吗? – 2012-02-17 19:20:20

回答

2

在您引入新的抽象层之前,请确保好处将超过成本。在你的情况,这些将包括:

成本来设计和实施抽象

StaffFactory更容易设计,比一般的工厂<牛逼>类实现和测试。

成本,了解工厂<牛逼>抽象

每当有人读的代码,他们可能需要环绕抽象他们的头。通用抽象比非泛型抽象更难缠绕头部。

成本进行更改在未来

比方说,你有厂<员工>和工厂<产品>,并在未来你会发现你想要两个不同的缓存策略。如果高速缓存大小超过某个阈值,工厂<产品>应放弃高速缓存的对象。

你打算推广工厂< >类以支持不同的模式?这可以做到,但它比单独修改StaffFactory和ProductFactory类复杂得多。

摘要

所以,不要引入一个抽象只是为了它的缘故。并且,如果工厂<工作人员>将成为您将拥有的唯一通用实例化,那么绝对不要将StaffFactory概括为通用工厂<T>。

从上面的代码,似乎你的工厂<牛逼>类将是基本上是字典<串,T >。如果是这种情况,那么引入额外的泛型Factory类并不会给您带来太多好处,而只会增加一个不必要的抽象层。

+0

感谢您的洞察力。我认为工厂类将是一个字典<类型,字典>,不是吗? – 2012-02-17 21:08:05