用于管理工厂类的基类

时间:2012-02-17 19:02:15

标签: c# oop inheritance dry code-reuse

我有一个StaffFactory用于通过各种方式获取Staff对象,但我也有一些设置方法来确定要使用的数据源。

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> { ... }或者其他东西声明了上面的内容,但是我正在绘制关于我将如何进行的完全空白。是否使用泛型等实现它

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

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

设计和实施抽象的成本

StaffFactory比通用工厂&lt; T&gt;更容易设计,实施和测试。类。

了解工厂&lt; T&gt;的成本抽象

每当有人阅读代码时,他们可能需要围绕抽象。通用抽象比非通用抽象更难以包围。

未来进行更改的费用

让我们说你有工厂&lt; Staff&gt;和Factory&lt; Product&gt;,将来你会发现你想要两个不同的缓存策略。也许工厂&lt;产品&gt;如果缓存大小超过某个阈值,则应丢弃缓存的对象。

您是否要概括工厂&lt;&gt;课程支持不同的模式?这可以做到,但它比仅仅单独修改StaffFactory和ProductFactory类要复杂得多。

<强>摘要

所以,不要仅仅为了它而引入一个抽象。并且,绝对不要将StaffFactory概括为通用工厂&lt; T&gt;如果工厂&lt;工作人员&gt;将成为你唯一的通用实例。

从上面的代码中,您的工厂似乎&lt; T&gt; class基本上是一个Dictionary&lt; string,T&gt;。如果是这样的话,那么引入额外的通用Factory类并没有给你带来太多好处,只会增加一个不必要的抽象层。

答案 1 :(得分:0)

据我所知,你要实现的是一个Repository模式。请参阅Repository pattern tutorial in C#的答案。