工厂模式,就是在你不知道具体要实例化哪个类的情况下,工厂根据你传入的数据来帮你搞定(根据你的需求帮你生产出来)。
这里面不知道自己要用哪个实例,实际就是多态性。接口标准化实际就是封装性。产品继承接口实际是继承特性。当你真的懂了工厂模式,你实际就懂了面向对象
在例子中:程序在开发的时候并不知道用户要用哪个数据库。这里可能要用 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