设计模式---工厂模型

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

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

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

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

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

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TJVictor.DesignPattern.FactoryPattern { public interface ISQLHelper { string GetData(); void SetData(string data); } }

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

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TJVictor.DesignPattern.FactoryPattern { public class SQLServer:ISQLHelper { private string _data; private SQLServer() { _data = "SQLServer"; } public static ISQLHelper GetInstance() { return new SQLServer() as ISQLHelper; } #region ISQLHelper Members public string GetData() { return _data; } public void SetData(string data) { _data = data; } #endregion } }

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

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TJVictor.DesignPattern.FactoryPattern { public class Accesss:ISQLHelper { private string _data; private Accesss() { _data = "Accesss"; } public static ISQLHelper GetInstance() { return new Accesss() as ISQLHelper; } #region ISQLHelper Members public string GetData() { return _data; } public void SetData(string data) { _data = data; } #endregion } }

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

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Configuration; namespace TJVictor.DesignPattern.FactoryPattern { public class SQLFactory { public static ISQLHelper GetInstance() { string appString = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString; string type = appString.Split(':')[0]; string conStr = appString.Split(':')[1]; //根据配置文件中的设置,返回对应的数据库实例 switch (type) { case "SQLServer": return SQLServer.GetInstance(); case "Access": return Accesss.GetInstance(); default: break; } return null; } } }

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

<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="ConStr" connectionString="SQLServer:server=tjvictor\sqlserver2008;Integrated Security = true;database=TestDB;MultipleActiveResultSets=true;"/> <!--<add name="ConStr" connectionString="Access:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mydatabase.mdb;User Id=admin;Password=;"/>--> </connectionStrings> </configuration>

调用代码

ISQLHelper sqlHelper = SQLFactory.GetInstance(); Show(sqlHelper.GetData()); sqlHelper.SetData("dddd"); Show(sqlHelper.GetData());

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

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

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

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

using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Xml; namespace TJVictor.DataBase.SqlHelper { public interface ISQLHelper { int ExecuteNonQuery(string executeSql); IDataReader ExecuteReader(string executeSql); T ExecuteScalar<T>(string executeSql); DataSet ExecuteDataSet(string executeSql); DataTable ExecuteTable(string executeSql); XmlReader ExecuteXmlReader(string executeSql); } }

如需转载,请注明本文原创自优快云 TJVictor专栏:http://blog.youkuaiyun.com/tjvictor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值