在第一篇文章中: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     }

 

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