- C#中抽象工厂模式的好例子是什么?
- 抽象工厂模式在C#中有哪些优点?
- 如何在C#中使用泛型与抽象工厂模式?
- 如何使用抽象工厂模式进行单元测试?
抽象工厂模式
。public interface IAgentA
{
// Add some methods here!
}
public interface IAgentB
{
// Add some methods here!
}
public interface IAgentFactory
{
IAgentA CreateAgentA();
IAgentB CreateAgentB();
}
现在针对这两个代理,我们有两种可能的实现方式,一种是用于 XML 存储,另一种是用于数据库存储(再次说明:这只是一个示例,你可以拥有任意多个实现类型)。这些实现看起来像这样(见下文)。请注意,我将构造函数设置为 internal
!这对于接下来的代码块非常重要。
public class AgentA_Xml : IAgentA
{
internal AgentA_Xml()
{ /* Construction here */}
// IAgentA method implementations
}
public class AgentB_Xml : IAgentB
{
internal AgentB_Xml()
{ /* Construction here */}
// IAgentB method implementations
}
public class AgentA_Database : IAgentA
{
internal AgentA_Database()
{ /* Construction here */}
// IAgentA method implementations
}
public class AgentB_Database : IAgentB
{
internal AgentB_Database()
{ /* Construction here */}
// IAgentB method implementations
}
由于构造函数是内部的,所以你无法在程序集之外实例化这些类,而通常这种情况下你会这样做。现在我们必须创建我们自己的工厂。
public class XMLAgentFactory : IAgentFactory
{
public IAgentA CreateAgentA()
{
return new AgentA_Xml();
}
public IAgentB CreateAgentB()
{
return new AgentB_Xml();
}
}
public class DatabaseAgentFactory : IAgentFactory
{
public IAgentA CreateAgentA()
{
return new AgentA_Database();
}
public IAgentB CreateAgentB()
{
return new AgentB_Database();
}
}
由于两个工厂都实现了IAgentFactory
接口,用户可以轻松地更改AgentFactory
的实现(如果他想使用不同的存储引擎),而无需更改编写的任何其他代码(针对代理),只要他针对接口进行了编程(显然)。internal
改为public
)。这可以通过将以下行添加到您的项目的AssemblyInfo.cs
文件中来轻松完成(其中包含您的工厂和类):[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("My.UnitTest.Namespace")]
你可以在MSDN上找到有关InternalsVisibleTo属性的更多信息(和备注)。
希望这种回答可以解决你的问题。