正确实施抽象工厂模式的方法?

时间:2012-04-27 10:29:42

标签: c# design-patterns data-access-layer abstract-factory

我即将以旧的ado.net方式构建数据访问层。传统上我会根据一个简单的存储库模式构建dal。但是这一次我想尝试抽象工厂模式,因为我最近在一篇文章中读过这个模式。

所以在这里我尝试使用抽象工厂模式编写dal代码。首先让我解释一下到目前为止我得到了什么。之后我想知道的是我的方法是否是实现这种模式的正确方法,以及对存储库方法的优势。

所以我编写了以下课程:

public abstract class Db
{
     //this is class will contain methods like:
     //public abstract IDbConnection CreateConnectionInstance();
}

public class SqlDb : Db
{
     //this is class will contain methods like:
     //public override IDbConnection CreateConnectionInstance()
     //{
     //      ... return new SqlConnection();
     //}
}

public class OracleDb : Db
{

}

public class MockupDb : Db
{

}

//this class generates the fitting provider but does not have a base (is this correct?)
public static class DbFactory
{
    public static Db CreateInstance(DbProviderType dbProviderType)
    {
        Db db = null;
        switch (dbProviderType)
        {
            case DbProviderType.Oracle:
                db = new OracleDb();
                break;
            case DbProviderType.Sql:
                db = new SqlDb();
                break;
            case DbProviderType.Mockup:
                db = new MockupDb();
                break;
            default:
                break;
        }
        return db;
    }
}

所以我的问题简而言之: 1)这是抽象工厂模式的正确实现吗? 2)什么可以做得更好? 3)从基类继承的不同存储库类有什么优势?

很多人。

如果您需要有关我的代码的更多信息,请告诉我。但此时此刻已经没有了!

2 个答案:

答案 0 :(得分:3)

抽象db提供程序工厂已存在于.Net中。它被称为DbProviderFactory。您可以通过

创建不同的混凝土工厂
var factory = DbProviderFactories.GetFactory("System.Data.OracleClient");
DbConnection connection = factory.CreateConnection();

为什么不使用盒子里已有的东西?

Here您可以阅读有关DbProviderFactories以及如何添加自定义工厂实施的更多信息。

答案 1 :(得分:0)

我想,你混合了一些概念。

存储库允许您从存储性质中抽象出来。它是一个黑盒子,它可以为你提供一个符合某些标准的物体,并将其收回。存储库内部可以在多个数据源中获取或存储对象(例如,存储在数据库中的一些对象数据,数据的另一部分 - 在文件中,或在外部设备中,这不能用关系数据源来描述)。

使用ADO .NET数据源时,工厂可以增加更多灵活性。但它不是存储库的替代品。存储库可以使用工厂来获取特定的数据源实现。

UPD。关于你的代码示例 - 当提供者的类型未知时,工厂应抛出异常。