网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

使用工厂方法模式实现多数据库WinForm手机号码查询器

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

 

关于工厂模式

先讲一下简单工厂模式、工厂方法模式、抽象工厂模式的东西:

  • 简单工厂模式(Simple Factory Pattern):工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关类,也就是说产品的创建逻辑集中于一个工厂类,客户端只需要传递不同的参数给工厂,这时情况是:一个工厂创建一个产品,所有的具体工厂继承自一个抽象工厂;对于客户端来说,不存在与具体产品的依赖;
  • 工厂方法模式(Factory Method Pattern):提前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现;
  • 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系统或相互依赖对象的接口,不需要指定具体类。抽象工厂正如其名字所说,它抽象的是工厂接口,因此它面向的是多个平等等级结构,其建立对象的原则是以功能相似的对象为单位划分需要建立的对象。

简单工厂并不属于23种基本设计模式中,它是抽象工厂模式的一个特例;抽象工厂与工厂方法区别在于它们抽象的对象不同:工厂方法针对产品进行抽象,而抽象工厂抽象针对工厂。因此可以认为工厂方法是抽象工厂的一种极端情况,工厂方法模式用来创建一个产品的等级结构,它一般只有一个方法,创建一种产品;而抽象工厂是用来创建多个产品的等级结构,一般有多个方法,创建一系列产品。

手机号码查询设计

此程序主要功能就是根据手机号码段查询相应的号码归属地。数据来自网络,数据表结构如下

数据记录超过17万条

这里我使用了Sqlite数据库,将此数据库文件转换为Sqlite数据库文件。

主程序界面设计如下:

业务逻辑分析

主程序调用业务逻辑层BLL,BLL使用抽象工厂DALFactory方法,DALFactory创建DAO实例对象,接口层IDAL定义数据操作接口方法,由数据访问层通过各自的公用数据操作类库进行读写数据库,实现对实体类Model的访问。

解决方案文件列表如图

其中DBUtility为公共数据访问类库。三个数据访问层SQLServerDAL、SqliteDAL和OleDAL分别对应Sql Server、Sqlite、Access数据库。这里我正在使用的是SqliteDAL。

具体实现

建立实体类进行对象封装

  1. public class list 
  2.     private int id; 
  3.     /// <summary> 
  4.     /// 编号 
  5.     /// </summary> 
  6.     public int Id 
  7.     { 
  8.         get { return id; } 
  9.         set { id = value; } 
  10.     } 
  11.     private string num; 
  12.     /// <summary> 
  13.     /// 号码段(手机号前7位) 
  14.     /// </summary> 
  15.     public string Num 
  16.     { 
  17.         get { return num; } 
  18.         set { num = value; } 
  19.     } 
  20.     private string code; 
  21.     /// <summary> 
  22.     /// 邮政编码 
  23.     /// </summary> 
  24.     public string Code 
  25.     { 
  26.         get { return code; } 
  27.         set { code = value; } 
  28.     } 
  29.     private string city; 
  30.     /// <summary> 
  31.     /// 城市 
  32.     /// </summary> 
  33.     public string City 
  34.     { 
  35.         get { return city; } 
  36.         set { city = value; } 
  37.     } 
  38.     private string cardtype; 
  39.     /// <summary> 
  40.     /// 卡类型 
  41.     /// </summary> 
  42.     public string Cardtype 
  43.     { 
  44.         get { return cardtype; } 
  45.         set { cardtype = value; } 
  46.     } 

 

App.config定义选用的DAL及数据库连接信息

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <configuration> 
  3.   <appSettings> 
  4.     <!--<add key="DAL" value="CuteMobileSearch.SQLServerDAL"/> 
  5.     <add key="DAL" value="CuteMobileSearch.SQLiteDAL"/> 
  6.     <add key="DAL" value="CuteMobileSearch.OleDAL"/>--> 
  7.     <!--当前使用DAL;可选以上三者之一,分别对应Sql Server、Sqlite、Access数据库--> 
  8.     <add key="DAL" value="CuteMobileSearch.SQLiteDAL"/> 
  9.     <add key="SqlConn" value="server=.;database=CuteMobileDB;uid=sa;pwd=123456"/> 
  10.     <add key="SqliteFile" value="/App_Data/db.db"/> 
  11.     <add key="OleFile" value="/App_Data/mobile.mdb"/> 
  12.   </appSettings> 
  13. </configuration> 

 

SqlConnStr.cs文件用于获得相应的连接字符串ConnectionString

  1. /// <summary> 
  2. /// 获得连接字符串ConnectingString 
  3. /// </summary> 
  4. public static class SqlConnString 
  5.     public static string ReturnConnString() 
  6.     { 
  7.         string _appPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//当前程序路径 
  8.         string _dal = System.Configuration.ConfigurationManager.AppSettings["DAL"];//获取App.Config中DAL 
  9.         string _conn = ""
  10.         switch (_dal) 
  11.         { 
  12.             /*Sqlite数据库*/ 
  13.             case "CuteMobileSearch.SQLiteDAL"
  14.             default
  15.                 _appPath = "Data Source=" + _appPath; 
  16.                 _appPath += System.Configuration.ConfigurationManager.AppSettings["SqliteFile"]; 
  17.                 return _appPath; 
  18.             /*SqlServer数据库*/ 
  19.             case "CuteMobileSearch.SQLServerDAL"
  20.                 _conn = "server=.;database=CuteMobileDB;uid=sa;pwd=123456"
  21.                 return _conn; 
  22.             /*access数据库*/ 
  23.             case "CuteMobileSearch.OleDAL"
  24.                 _appPath = "provider=microsoft.jet.oledb.4.0;data source=" + _appPath + System.Configuration.ConfigurationManager.AppSettings["OleFile"]; 
  25.                 return _appPath; 
  26.         } 
  27.     } 

 

然后是抽象工厂DAL通过使用反射创建接口对象的实例

  1. /// <summary> 
  2. /// 创建抽象工厂 
  3. /// </summary> 
  4. public sealed class ObjectCreate 
  5.     /*所使用程序集*/ 
  6.     public static readonly string asseblyDAL = System.Configuration.ConfigurationManager.AppSettings["DAL"]; 
  7.  
  8.     /// <summary> 
  9.     /// 创建对象(不使用缓存:B/S使用) 
  10.     /// </summary> 
  11.     /// <param name="AssemblyPath"></param> 
  12.     /// <param name="classNamespace"></param> 
  13.     /// <returns></returns> 
  14.     private static object CreateObject(string AssemblyPath, string classNamespace) 
  15.     { 
  16.         try 
  17.         { 
  18.             object objType = Assembly.Load(AssemblyPath).CreateInstance(classNamespace); 
  19.             return objType; 
  20.         } 
  21.         catch 
  22.         { 
  23.             return null
  24.         } 
  25.     } 
  26.  
  27.     /// <summary> 
  28.     /// 创建list接口对象 
  29.     /// </summary> 
  30.     /// <returns></returns> 
  31.     public static CuteMobileSearch.IDAL.Ilist CreateListObj() 
  32.     { 
  33.         string className = asseblyDAL + ".listServices"
  34.         object obj = CreateObject(asseblyDAL, className); 
  35.         return (CuteMobileSearch.IDAL.Ilist)obj; 
  36.     } 

 

IDAL声明数据访问的接口方法

  1. public interface Ilist 
  2.     /*添加对象*/ 
  3.     int Add(CuteMobileSearch.Model.list objList); 
  4.     /*返回所有*/ 
  5.     List<CuteMobileSearch.Model.list> GetAll(); 
  6.     /*根据号码查询*/ 
  7.     List<Model.list> GetListByNum(string num); 
  8.     /*根据查询条件*/ 
  9.     List<CuteMobileSearch.Model.list> GetListByWhere(string strWhere); 

 

SqliteDAL继承IDAL,实现对数据库的访问和操作,来访问实体类Model

  1. /// <summary> 
  2. /// 基于Sqlite的数据访问类库 
  3. /// </summary> 
  4. public class listServices : IDAL.Ilist 
  5.     /// <summary> 
  6.     /// 添加 
  7.     /// </summary> 
  8.     /// <returns>返回添加数目</returns> 
  9.     public int Add(CuteMobileSearch.Model.list objList) 
  10.     { 
  11.         StringBuilder sbSql = new StringBuilder(); 
  12.         sbSql.Append("INSERT INTO list("); 
  13.         sbSql.Append("num,code,city,cardtype)"); 
  14.         sbSql.Append(" VALUES("); 
  15.         sbSql.Append("@num,@code,@city,@cardtype)"); 
  16.         sbSql.Append(";SELECT @@IDENTITY"); 
  17.         SQLiteParameter paras ={ 
  18.             new SQLiteParameter("@num",DbType.String,8), 
  19.             new SQLiteParameter("@code",DbType.String,8), 
  20.             new SQLiteParameter("@city",DbType.String,16), 
  21.             new SQLiteParameter("@cardtype",DbType.String,16) 
  22.         }; 
  23.         paras[0].Value = objList.Num; 
  24.         paras.Value = objList.Code; 
  25.         paras.Value = objList.City; 
  26.         paras.Value = objList.Cardtype; 
  27.         int num = Wang.DBUtility.SqliteHelper.ExecuteCommand(sbSql.ToString()); 
  28.         return num; 
  29.     } 
  30.  
  31.     /// <summary> 
  32.     /// 返回List<> 
  33.     /// </summary> 
  34.     /// <returns></returns> 
  35.     public List<CuteMobileSearch.Model.list> GetAll() 
  36.     { 
  37.         return GetListByWhere(""); 
  38.     } 
  39.  
  40.     /// <summary> 
  41.     /// 根据号码查询 
  42.     /// </summary> 
  43.     /// <param name="num"></param> 
  44.     /// <returns></returns> 
  45.     public List<Model.list> GetListByNum(string num) 
  46.     { 
  47.         string strWhere = "num LIKE '" + num + "%'"
  48.         return GetListByWhere(strWhere); 
  49.     } 
  50.  
  51.     /// <summary> 
  52.     /// 根据条件返回List<> 
  53.     /// </summary> 
  54.     /// <param name="strWhere"></param> 
  55.     /// <returns></returns> 
  56.     public List<CuteMobileSearch.Model.list> GetListByWhere(string strWhere) 
  57.     { 
  58.         List<CuteMobileSearch.Model.list> listList = new List<CuteMobileSearch.Model.list>(); 
  59.         StringBuilder strSql = new StringBuilder(); 
  60.         strSql.Append("SELECT * FROM list"); 
  61.         if (strWhere != ""
  62.         { 
  63.             strSql.Append(" WHERE "); 
  64.             strSql.Append(strWhere); 
  65.         } 
  66.         SQLiteDataReader reader = Wang.DBUtility.SqliteHelper.GetReader(strSql.ToString()); 
  67.         while (reader.Read()) 
  68.         { 
  69.             CuteMobileSearch.Model.list objList = new CuteMobileSearch.Model.list(); 
  70.             if (reader["id"].ToString() != String.Empty) 
  71.             { 
  72.                 objList.Id = int.Parse(reader["id"].ToString()); 
  73.             } 
  74.             objList.Num = reader["num"].ToString(); 
  75.             objList.Code = reader["code"].ToString(); 
  76.             objList.City = reader["city"].ToString(); 
  77.             objList.Cardtype = reader["cardtype"].ToString(); 
  78.  
  79.             listList.Add(objList); 
  80.         } 
  81.         reader.Close(); 
  82.         return listList; 
  83.     } 

 

以其中的查询结果的GetListByNum方法的UML类图如下

运行结果
主程序运行效果如下图

查看详细信息

总结
此类基于多数据库操作的应用程序是很常见的,通过使用工厂方法模式进行架构,以业务逻辑分层、抽象实现数据访问的思想进行开发,显然在程序的可扩展性、层次性具有较大的优势。
另一点值得说的是,Sqlite数据库的确在一些应用场合中具有较大的优势,关于Sqlite数据库的介绍请参见此文http://zh.wikipedia.org/wiki/SQLite

  • 下一篇资讯: 推荐web中用到的编辑器
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师