标签:
在第一篇文章中:http://www.cnblogs.com/lystory/p/5083046.html
我们介绍了简单工厂模式,工厂方法模式是简单工厂的一种升级做法。
1、在简单工厂里面,我们增加一个新产品 就必须要修改 DBFactory,重新编译程序,让它来支持新的产品实例。
2、在工厂方法里面,我们增加一种新产品,只需要增加一个产品对应的程序集,比如增加oracle,只需要把程序集复制到软件目录下面。然后更改一下配置文件就可以了,原有代码一点也不用改。是不是很爽啊!
这样做既有简单工厂的所有优点,同时又解决了简单工厂的一个重要缺点,耦合性的问题。
程序(Program): 这个是消费者,是稳定的。
产品协议(IDbAccess):定义了产品的标准服务“国标”。
工厂协议(DBFactory):定义了工厂的标准服务“国标”。
产品(SQLServer、OleDb ):具体实际产品。
工厂(sqlFactory、oledbFactory):这里做转义产品服务,将服务包装给程序(Program)。
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 6 DBFactory sqlFactory = new sqlFactory(); 7 8 IDbAccess sqlaccess = sqlFactory.Create(); 9 10 sqlaccess.insert("指定使用SQL实例"); 11 12 Console.ReadLine(); 13 14 //使用反射优化,修改变量就可得到想要的结果,而不必修改代码 15 string strfactoryName = "sqlFactory"; 16 17 ///通过配置文件,我们就可以指定要使用的工厂,和简单工厂相比,我们在创建一个新实例的时候,不需要修改任何原有代码,只需要复制做好的程序集到软件目录下面。再改一下配置文件就OK了 18 /// string strfactoryName = root.SelectSingleNode("DataBaseType"); 19 20 DBFactory dbFactory; 21 dbFactory = (DBFactory)Assembly.Load("设计模式").CreateInstance("设计模式.工厂方法模式." + strfactoryName); 22 23 IDbAccess idbaccess = dbFactory.Create(); 24 25 sqlaccess.insert("此时是由程序运行时根据参数strfactoryName,来动态地指定使用哪个程序集代码"); 26 27 Console.ReadLine(); 28 } 29 } 30 31 /// <summary> 32 /// 所有的数据访问接口 33 /// </summary> 34 public abstract class IDbAccess 35 { 36 public abstract string insert(string Name); 37 } 38 39 /// <summary> 40 /// sql 产品 41 /// </summary> 42 public class SQLServer : IDbAccess 43 { 44 //相关的方法 45 public System.Data.SqlClient.SqlConnection Connection 46 { 47 get 48 { 49 return new System.Data.SqlClient.SqlConnection(); 50 } 51 } 52 53 public override string insert(string Name) 54 { 55 return "SQLServer"; 56 } 57 58 } 59 60 /// <summary> 61 /// OleDb 产品 62 /// </summary> 63 public class OleDb : IDbAccess 64 { 65 //相关的方法 66 public System.Data.OleDb.OleDbConnection Connection 67 { 68 get 69 { 70 return new System.Data.OleDb.OleDbConnection(); 71 } 72 } 73 74 public override string insert(string Name) 75 { 76 return "OleDb"; 77 } 78 79 } 80 81 /// <summary> 82 /// 实现工厂和产品sqlFactory 83 /// </summary> 84 public class sqlFactory : DBFactory 85 { 86 public override IDbAccess Create() 87 { 88 return new SQLServer(); 89 } 90 } 91 92 /// <summary> 93 /// 实现工厂和产品oledbFactory 94 /// </summary> 95 public class oledbFactory : DBFactory 96 { 97 public override IDbAccess Create() 98 { 99 return new OleDb(); 100 } 101 } 102 103 /// <summary> 104 /// 定义工厂基类 105 /// </summary> 106 public abstract class DBFactory 107 { 108 public abstract IDbAccess Create(); 109 }
如果新增加oracle
就如下代码:(将它单独做成一个程序集,名字空间要一样、在配置文件中直接改一下就OK了。很完美吧?)
1 /// <summary> 2 /// oracle 产品 3 /// </summary> 4 public class oracle : IDbAccess 5 { 6 public override string insert(string Name) 7 { 8 return "oracle"; 9 } 10 11 } 12 13 /// <summary> 14 /// 实现工厂和产品oracleFactory 15 /// </summary> 16 public class oracleFactory : DBFactory 17 { 18 public override IDbAccess Create() 19 { 20 return new oracle(); 21 } 22 }
标签:
原文地址:http://www.cnblogs.com/lystory/p/5085020.html