设计模式---工厂模型

下面用工厂模型来实现一个连接数据库的例子。实现在不改变代码的前提下,只通过修改相应的配置文件,就可以达到连接SQL Server和Access的目的。

在现实情况中,我们经常遇到同一个程序,在不同的地方要连接不同数据库的问题。为此,我们传统做法是把所有的代码都写在程序中,用if else做判断,然后再选择要连接的数据库。

下面的程序使用工厂模型的概念,利用接口来实现在不改变代码的前提下,只需改动相应的配置文件,就可以达到切换数据库的目的。而且在连接未知数据库时,也不需要改原代码,只需要扩展接口实现类.

说明:示例共有五个文件。

ISQLHelper.cs是定义数据访问接口文件。里面定义了两个数据访问方法:GetData()和SetData()

[c-sharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace TJVictor.DesignPattern.FactoryPattern  
  7. {  
  8.     public interface ISQLHelper  
  9.     {  
  10.         string GetData();  
  11.   
  12.         void SetData(string data);  
  13.     }  
  14. }  

SQLSever.cs继承ISQLHelper接口,实现接口方法

[c-sharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace TJVictor.DesignPattern.FactoryPattern  
  7. {  
  8.     public class SQLServer:ISQLHelper  
  9.     {  
  10.         private string _data;  
  11.         private SQLServer()  
  12.         {  
  13.             _data = "SQLServer";  
  14.         }  
  15.   
  16.         public static ISQLHelper GetInstance()  
  17.         {  
  18.             return new SQLServer() as ISQLHelper;  
  19.         }  
  20.  
  21.         #region ISQLHelper Members  
  22.         public string GetData()  
  23.         {  
  24.             return _data;  
  25.         }  
  26.   
  27.         public void SetData(string data)  
  28.         {  
  29.             _data = data;  
  30.         }  
  31.         #endregion  
  32.     }  
  33. }  

Access.cs继承ISQLHelper接口,实现接口方法

[c-sharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace TJVictor.DesignPattern.FactoryPattern  
  7. {  
  8.     public class Accesss:ISQLHelper  
  9.     {  
  10.         private string _data;  
  11.         private Accesss()  
  12.         {  
  13.             _data = "Accesss";  
  14.         }  
  15.   
  16.         public static ISQLHelper GetInstance()  
  17.         {  
  18.             return new Accesss() as ISQLHelper;  
  19.         }  
  20.  
  21.         #region ISQLHelper Members  
  22.         public string GetData()  
  23.         {  
  24.             return _data;  
  25.         }  
  26.   
  27.         public void SetData(string data)  
  28.         {  
  29.             _data = data;  
  30.         }  
  31.         #endregion  
  32.     }  
  33. }  

SQLFactory.cs是工厂类,根据配置文件动态创建SQLServer或是Access

[c-sharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Configuration;  
  6.   
  7. namespace TJVictor.DesignPattern.FactoryPattern  
  8. {  
  9.     public class SQLFactory  
  10.     {  
  11.         public static ISQLHelper GetInstance()  
  12.         {  
  13.             string appString =  
  14.                     ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;  
  15.             string type = appString.Split(':')[0];  
  16.             string conStr = appString.Split(':')[1];  
  17.             //根据配置文件中的设置,返回对应的数据库实例  
  18.             switch (type)  
  19.             {  
  20.                 case "SQLServer"return SQLServer.GetInstance();  
  21.                 case "Access"return Accesss.GetInstance();  
  22.                 defaultbreak;  
  23.             }  
  24.             return null;  
  25.         }  
  26.     }  
  27. }  

App.config是配置文件,定义本地程序需要用哪种数据库连接

[c-sharp]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.   <connectionStrings>  
  4.     <add name="ConStr" connectionString="SQLServer:server=tjvictor/sqlserver2008;Integrated Security = true;database=TestDB;MultipleActiveResultSets=true;"/>  
  5.     <!--<add name="ConStr" connectionString="Access:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:/mydatabase.mdb;User Id=admin;Password=;"/>-->  
  6.   </connectionStrings>  
  7. </configuration>  

调用代码

[c-sharp]  view plain  copy
  1. ISQLHelper sqlHelper =  
  2.                 SQLFactory.GetInstance();  
  3.             Show(sqlHelper.GetData());  
  4.             sqlHelper.SetData("dddd");  
  5.             Show(sqlHelper.GetData());  

大家已经注意到了,调用代码里面都是面向接口编程的,所以只要接口稳定,那么程序的升级或是改动也就是稳定的。

情况一,修改Access的某个访问方法:只需要改Access里面的代码,不需要改主程序的任何地方。

情况二,增加对MySQL的支持:只需要增加一个MySql.cs,继承ISQLHelper,Factory里面增加对MySQL的判断即可。主程序不需要改任何地方,只需要把配置文件改成MySQL的连接字符串即可。

 

上面的程序只是示例程序,里面的GetData()和SetData()没有意义,下面我给出在一般情况下访问数据库时,需要的接口方法,大家可以按照上面的代码说明,去实现自己的SQLHelper类。

[c-sharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Data;  
  5. using System.Xml;  
  6.   
  7. namespace TJVictor.DataBase.SqlHelper  
  8. {  
  9.     public interface ISQLHelper  
  10.     {  
  11.         int ExecuteNonQuery(string executeSql);  
  12.           
  13.         IDataReader ExecuteReader(string executeSql);  
  14.          
  15.         T ExecuteScalar<T>(string executeSql);        
  16.          
  17.         DataSet ExecuteDataSet(string executeSql);  
  18.           
  19.         DataTable ExecuteTable(string executeSql);  
  20.           
  21.         XmlReader ExecuteXmlReader(string executeSql);  
  22.     }  
  23. }  

如需转载,请注明本文原创自CSDN TJVictor专栏:http://blog.csdn.net/tjvictor

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值