我有一个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> { ... }
或者其他东西声明了上面的内容,但是我正在绘制关于我将如何进行的完全空白。是否使用泛型等实现它
有人能指出我正确的方向吗?
答案 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#的答案。