抽象工厂模式(闭合)(Abstract factory pattern [closed])

2019-06-24 07:10发布

  1. 在C#中抽象工厂模式很好的例子?
  2. 什么是C#中的抽象工厂模式的优势是什么?
  3. 如何使用C#泛型与抽象工厂模式?
  4. 如何使用抽象工厂模式的单元测试?

Answer 1:

首先,我建议你阅读有关抽象工厂模式,例如在这里 。 现在,我会尽量解释为什么要使用这种模式。

通常情况下,如果使用工厂模式,您将创建一个工厂对象。 当你有多个实现给定类(或类),就会出现问题。 现在,这些多种实现分组。 您将使用Abstract Factory pattern ,当你有一个工厂,但是你想组每组对象的创建。

好了,以上的解释可能并不完全清楚,所以我给你举个例子。

比方说,你有一个类库与数据剂。 数据代理为您提供的方法来访问和存储不同的数据。 当然,也有将数据存储的多种方式。 例如:在一个数据库中的XML文件,过服务。 对于每一种可能的方式,你想有数据代理。 现在的问题是,你不希望有人使用DataAgentA为XML文件连同DataAgentB数据库(假设我们有实体A和B)。 用户只能使用一个存储引擎。

让我给你介绍抽象工厂模式。

您将确保用户不能直接实例化你的数据代理商,但他们必须得到这些数据代理出工厂。 (一个额外的好处是,当你使用,例如数据库(EF),你可以做内部布线,以确保您的数据代理使用相同的上下文等)我们如何做到这一点? 我们设定我们的数据代理的构造函数'internal'。 除此之外,我们为每个存储引擎不同的工厂。 现在,因为这些工厂都做同样的,我们也有这些接口(就像我们的数据剂,因为他们都做同样的,对吧!?)。

下面我们有我们的接口。 基本上,这是工厂模式,但只有现在不是关于类的 ,我们正在谈论的接口

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)。

  1. 在C#中抽象工厂模式很好的例子?
  2. 什么是C#抽象工厂模式的优势是什么?

回答你的问题(3)。

  1. 如何使用C#与抽象工厂模式的仿制药?

您仍然可以使用泛型,当您使用抽象工厂模式这不会改变任何位。 当然,你必须创建一个通用的工厂方法(该方法的创建),但不应该有任何问题。

回答你的问题(4)。

  1. 如何与抽象工厂模式的单元测试?

虽然如此,你会单元测试任何其他类。 只有一件事会有所不同。

因为你很可能也想测试你的类(也许其他内部方法)的构造函数,你需要做的内部构造(方法)看到你的单元测试项目(和你不想改变internalpublic ) 。 这是很容易通过添加以下行到你做AssemblyInfo.cs项目(该项目在您的工厂和类在内)的文件:

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("My.UnitTest.Namespace")]

你可以找到有关的InternalsVisibleTo属性的详细信息(和备注) MSDN

我希望这样的答案你的问题。



文章来源: Abstract factory pattern [closed]