- C#中抽象工厂模式的好例子?
- C#中抽象工厂模式的优点是什么?
- 如何在抽象工厂模式中使用C#泛型?
- 如何用抽象工厂模式进行单元测试?
抽象工厂模式
回答
首先,我建议您阅读关于抽象工厂模式,例如here。现在我将尝试解释为什么你会使用这种模式。
通常,如果使用工厂模式,您将在工厂中创建对象。当你有一个给定的类(或类)的多个实现时,问题就出现了。现在,这些多个实现被分组。当您拥有工厂时,您将使用Abstract Factory pattern
,但您想将每个组的对象创建分组。
好的,上面的解释可能不完全清楚,所以我会举个例子。
比方说,你有一个包含数据代理的类库。数据代理为您提供访问和存储不同数据的方法。当然,有多种存储数据的方式。例如:在数据库中,在XML文件中,在服务上。对于这些可能的方法中的每一种,您都希望拥有数据代理。现在的问题是,您不希望某人将DataAgentA用于XML文件以及DataAgentB用于数据库(假设我们有实体A和B)。用户只能使用一个存储引擎。
让我给你介绍抽象工厂模式。
您将确保用户不能直接实例化您的数据代理,但他们必须将这些数据代理从工厂中取出。 (另外一个好处是,当您使用例如数据库(EF)时,您可以执行内部接线以确保您的数据代理使用相同的上下文等)。我们如何完成此任务?我们将数据代理的构造函数设置为“内部”。除此之外,我们为每个存储引擎创建不同的工厂。现在,由于这些工厂都做同样的事情,我们也有这些接口(就像我们的数据代理,因为他们都必须这样做,对!)。
下面我们有我们的接口。基本上这是工厂模式,但只有现在,而不是类,我们正在谈论接口。
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
实现改变(如果他在这种情况下,要使用不同的存储引擎),而无需改变他写的任何其他代码(反对代理商),只要他对接口进行编程(显然)。
以上解释有希望回答您的问题(1)和(2)。
- C#中抽象工厂模式的好例子?
- 和c#中抽象工厂模式的优点是什么?
回答你的问题(3)。
- 如何在抽象工厂模式中使用C#泛型?
您仍然可以使用泛型,当您使用抽象工厂模式这不会改变任何位。当然,你将不得不创建泛型工厂方法(创建方法),但这不应该是任何问题。
回答你的问题(4)。
- 如何使用抽象工厂模式进行单元测试?
就像你会单元测试任何其他类一样。只有一件事情会有所不同。
由于您可能还想测试类的构造函数(以及其他内部方法),因此您需要使内部构造函数(方法)对您的单元测试项目可见(并且您不希望更改internal
至public
)。
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("My.UnitTest.Namespace")]
你可以找到更多信息(和备注)关于MSDN的InternalsVisibleTo属性:这是很容易通过添加以下行到您的AssemblyInfo.cs
文件的项目(该项目在您的工厂和类中)来完成。
我希望这种回答你的问题。
这个答案是人们谈论过的那些隐藏的宝石之一。非常好的解释。谢谢。 – ppumkin
- 1. 工厂模式抽象工厂模式
- 2. 工厂和抽象工厂模式
- 3. 抽象工厂模式
- 4. 抽象工厂模式
- 5. 了解抽象工厂设计模式中的抽象工厂设计模式
- 6. 如何应用抽象工厂模式?
- 7. 关于抽象工厂模式的undrestanding
- 8. 抽象工厂设计模式c#
- 9. 抽象工厂模式和HikariCP
- 10. PHP抽象工厂模式实现
- 11. 与抽象工厂模式澄清后
- 12. MVC 3和抽象工厂模式
- 13. 抽象工厂设计模式 - C#
- 14. 何时使用抽象工厂模式?
- 15. 设计模式 - 抽象工厂 - BombedMazeFactory
- 16. 抽象工厂
- 17. 抽象工厂模式 - 混凝土工厂
- 18. DbProviderFactory ADO.Net中的抽象工厂和工厂模式?
- 19. 抽象工厂模式和工厂在产品中的多级工厂
- 20. 模型对象内的抽象工厂?
- 21. 结合泛型MVP模式与抽象工厂模式
- 22. 模板抽象工厂类与池
- 23. 抽象工厂模式 - 右键的方式来实现它
- 24. 在单元测试中使用工厂/抽象工厂设计模式
- 25. 工厂方法和抽象工厂设计模式有什么区别?
- 26. 客户端VS在工厂方法和抽象工厂模式的创造者
- 27. 在抽象工厂模式中插入工厂方法的位置?
- 28. 抽象工厂改进
- 29. 抽象工厂泛型
- 30. Paramaterized抽象工厂在Autofac
http://www.dofactory.com/Patterns/PatternAbstract.aspx – Habib
问题应该更具体。看起来,就像你不想找到关于你的主题的信息,只是想让别人解释你的主题。 –
您也可以调查抽象工厂模式的其他模式。 http://www.dofactory.com/Patterns/Patterns.aspx –