工厂模式,就是在你不知道具体要实例化哪个类的情况下,工厂根据你传入的数据来帮你搞定(根据你的需求帮你生产出来)。

这里面不知道自己要用哪个实例,实际就是多态性。接口标准化实际就是封装性。产品继承接口实际是继承特性。当你真的懂了工厂模式,你实际就懂了面向对象

 

在例子中:程序在开发的时候并不知道用户要用哪个数据库。这里可能要用 SQLServer 、或者MYSQL、或者是OLEDB。其中之一。

 

工厂:根据用户的配置文件、来帮用户返回具体的数据库实例(工厂负责根据用户的需求来生产出具体的实例)

 

接口:接口用于标准化,因为你的实例只有你在运行中才知道,创建时并不知道。所以你要制定一个标准格式,所有的基础服务产品(数据库)都要尊守这个格式。(实际表现为,接口定义有哪些服务,产品继承接口、实现接口。)在C#中,接口可以用 interface、abstract两种类来做 

 

接口(IDbAccess):就是一个标准协议。它就是为各类产品定义一个“国标”,你的产品允许有差异,但是你必须符合接口这个定义的“国标”框架。

产品(SQLServer、OleDb ):它通过尊守协议(继承接口、实现接口)成为一个符合使用规定的产品。

工厂(DBFactory):负责根据需求(程序通过参数(root.SelectSingleNode("DataBaseType");)告诉工厂需求)生产具体的产品。

程序(Program):也叫服务消费者。就是最终消费不同的产品(SQLServer、OleDb)

 

接口和工厂是为了,程序消费产品服务的。接口负责标准的制定,工厂负责根据需求生产具体的产品。

 

使用工厂来完成程序的多数据库支持

 

  class Program
    {
        static void Main(string[] args)
        {

            DBFactory factory = new DBFactory();
            IDbAccess dbaccess = factory.CreateByEnum(DbType.SQLServer);
            dbaccess.insert("1111");
            ///这里我并不知道是谁的 INSETR,是哪一个产品给我的方法。只有在程序运行的时候才知道
            Console.Read();
        }
    }

    /// <summary> 
    /// 所有的数据访问接口 
    /// </summary> 
    public interface IDbAccess
    {
        int insert(string Name);
    }





    public class SQLServer : IDbAccess
    {
        //相关的方法 
        public System.Data.SqlClient.SqlConnection Connection
        {
            get
            {
                return new System.Data.SqlClient.SqlConnection();
            }
        }

        public int insert(string Name)
        {
            return 1;
        }
    }

    public class OleDb : IDbAccess
    {
        //相关的方法 
        public System.Data.OleDb.OleDbConnection Connection
        {
            get
            {
                return new System.Data.OleDb.OleDbConnection();
            }
        }

        public int insert(string Name)
        {
            return 2;
        }
    }

    /// <summary>
    /// 配置文件来整
    /// </summary>
    public class DBFactory2
    {
        public IDbAccess Create()
        {
            IDbAccess dbAccess = null;

            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.LoadXml("");

            XmlElement root = doc.DocumentElement;//XML文档的根节点 
            XmlNode node = root.SelectSingleNode("DataBaseType");

            switch (node.InnerText.ToLower())
            {
                case "sqlserver":
                    dbAccess = new SQLServer();
                    break;
                case "oledb":
                    dbAccess = new OleDb();
                    break;
                default:
                    break;
            }

            return dbAccess;
        }
    }

    /// <summary>
    /// 枚举来整
    /// </summary>
    public class DBFactory
    {
        public IDbAccess CreateByEnum(DbType dbType)
        {
            IDbAccess dbAccess = null;

            switch ((int)dbType)
            {
                case (int)DbType.SQLServer:
                    dbAccess = new SQLServer();
                    break;
                case (int)DbType.OleDb:
                    dbAccess = new OleDb();
                    break;
                default:
                    break;
            }

            return dbAccess;
        }
    }

    public enum DbType
    {
        SQLServer = 0,
        OleDb = 1
    }

 

 

什么时候使用工厂方法(此段摘自:《c#设计模式》,理解下)

下列情况考虑使用工厂方法

1.类不能预测它必须创建哪一种类型的对象。

2.类使用它的子类指定他要创建的对象。

3.希望只有局部知晓那个类被创建。

关于工厂模式会有几种变化,需要了解一下。

1.基类是抽象的,但模式必须返回一个可用的对象。

2.基类包含默认的方法,只有在默认方法不能胜任的情况下才调用这些方法。

3.传递给工厂的参数告知其返回几种类型的类中的哪一个,在这种情况下,类可能会共用相同的方法名称,但要实现的事情可能是很不相同的。

 

参考文档

http://www.cnblogs.com/knowledgesea/p/3919824.html

 

posted on 2015-12-29 10:00  梦回过去  阅读(338)  评论(0编辑  收藏  举报