简单工厂模式(Simple Factory)

做小型企业软件开发,有时一个系统要与多个数据库进行交互,有时数据库还不同,有的数据存放在SQL Server中,有的存放在Oracle中,这样在写代码时,还要注意到底连接的是什么数据库,连接SQL Server时要用SqlConnection,连接Oracle时要用OracleConnection,这样给开发带来不方便,虽然目前已经有许多成熟的开发框架(Castle, Spring.NET等),但是大多数人都不怎么会使用(例如包括我自己),而且框架中许多功能对小型企业软件来讲也没有用。针对这种情况,开发小型企业软件系统时,我们可以用简单工厂模式来写一个同一的获取数据库连接的工厂类,只需要传递一个连接数据对象给工厂类的创建连接方法即可以获取你要的连接。下面看代码:

(1)连接信息类,用于存储数据库连接信息,这些信息可以从配置文件中读取,或者XML文件,然后存在一个集合对象中,如HashTable。

public class ConnInfo
{
    private string _name;
    private string _type;
    private string _connString;

    /// <summary>
    /// 连接名称
    /// </summary>
    public string Name
    {
        get { return _name; }
    }

    /// <summary>
    /// 连接类型
    /// </summary>
    public string Type
    {
        get { return _type; }
    }

    /// <summary>
    /// 连接字符串
    /// </summary>
    public string ConnString
    {
        get { return _connString; }
    }

    public ConnInfo(string name, string type, string connString)
    {
        _name = name;
        _type = type;
        _connString = connString;
    }
}

(2)连接简单工厂类,用于创建连接对象。

public class ConnFactory
{
    public ConnFactory()
    {
    }

    public static IDbConnection Create(ConnInfo ci)
    {
        IDbConnection con = null;

        switch (ci.Type)
        {
            case "Odbc":
                con = new OdbcConnection(ci.ConnString);
                break;
            case "OleDb":
                con = new OleDbConnection(ci.ConnString);
                break;
            case "SqlServer":
                con = new SqlConnection(ci.ConnString);
                break;
            case "Oracle":
                con = new OracleConnection(ci.ConnString);
                break;
        }

        return con;
    }
}

这里是返回实现IDbConnection这个接口的类别的实例,因为所有DbConnection都实现了这个接口,所以在开发的时候,我们只需要使用这个接口就可以了,例如:IDbConnection con = ConnFactory.Create(connInfo); 这样就可以根据connInfo的数据库类型得到上面简单工厂创建的一个连接。而不需要根据数据库不同这样写,SqlConnection con = new SqlConnection(connString);

    这个简单工厂模式有它的优点,但是也有它的缺点,缺点就是,一旦有新的数据库类型,那么就要修改这个工厂类,也就是要加一个case语句,这样一来,如果代码是编译成了一个dll文件,那么你需要再次编译这段代码,工程大的话,编译起来很慢,很费时,不方便;二来,如果case语句很多也不好,我不清楚有没有代码质量问题,但总感觉太多不好看。

posted @ 2008-07-28 08:38  known  阅读(442)  评论(0编辑  收藏  举报