设计模式---工厂模型

    xiaoxiao2021-03-25  72

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

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

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

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

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

    [c-sharp]  view plain  copy 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接口,实现接口方法

    [c-sharp]  view plain  copy 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接口,实现接口方法

    [c-sharp]  view plain  copy 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

    [c-sharp]  view plain  copy 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();                   defaultbreak;               }               return null;           }       }   }  

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

    [c-sharp]  view plain  copy <?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>  

    调用代码

    [c-sharp]  view plain  copy 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类。

    [c-sharp]  view plain  copy 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.csdn.net/tjvictor

    转载请注明原文地址: https://ju.6miu.com/read-37568.html

    最新回复(0)