日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁編程開發(fā)C#.NET → 使用工廠方法模式實現(xiàn)多數(shù)據(jù)庫WinForm手機號碼查詢器(附源碼)

      使用工廠方法模式實現(xiàn)多數(shù)據(jù)庫WinForm手機號碼查詢器(附源碼)

      相關軟件相關文章發(fā)表評論 來源:Walkingp時間:2010/4/3 23:42:41字體大。A-A+

      作者:佚名點擊:480次評論:0次標簽: WinForm

      • 類型:編程輔助大。3.3M語言:中文 評分:4.4
      • 標簽:
      立即下載

      2010年4月3日使用工廠方法模式實現(xiàn)多數(shù)據(jù)庫WinForm手機號碼查詢器(附源碼)

      關于工廠模式

      先講一下簡單工廠模式、工廠方法模式、抽象工廠模式的東西:

      • 簡單工廠模式(Simple Factory Pattern):工廠類中包含了必要的邏輯判斷,根據(jù)客戶端的選擇條件動態(tài)實例化相關類,也就是說產品的創(chuàng)建邏輯集中于一個工廠類,客戶端只需要傳遞不同的參數(shù)給工廠,這時情況是:一個工廠創(chuàng)建一個產品,所有的具體工廠繼承自一個抽象工廠;對于客戶端來說,不存在與具體產品的依賴;
      • 工廠方法模式(Factory Method Pattern):提前定義用于創(chuàng)建對象的接口,讓子類決定實例化具體的某一個類,即在工廠和產品中間增加接口,工廠不再負責產品的創(chuàng)建,由接口針對不同條件返回具體的類實例,由具體類實例去實現(xiàn);
      • 抽象工廠模式(Abstract Factory Pattern):提供一個創(chuàng)建一系統(tǒng)或相互依賴對象的接口,不需要指定具體類。抽象工廠正如其名字所說,它抽象的是工廠接口,因此它面向的是多個平等等級結構,其建立對象的原則是以功能相似的對象為單位劃分需要建立的對象。

      簡單工廠并不屬于23種基本設計模式中,它是抽象工廠模式的一個特例;抽象工廠與工廠方法區(qū)別在于它們抽象的對象不同:工廠方法針對產品進行抽象,而抽象工廠抽象針對工廠。因此可以認為工廠方法是抽象工廠的一種極端情況,工廠方法模式用來創(chuàng)建一個產品的等級結構,它一般只有一個方法,創(chuàng)建一種產品;而抽象工廠是用來創(chuàng)建多個產品的等級結構,一般有多個方法,創(chuàng)建一系列產品。

      手機號碼查詢設計

      此程序主要功能就是根據(jù)手機號碼段查詢相應的號碼歸屬地。數(shù)據(jù)來自網(wǎng)絡,數(shù)據(jù)表結構如下

      數(shù)據(jù)記錄超過17萬條

      這里我使用了Sqlite數(shù)據(jù)庫,將此數(shù)據(jù)庫文件轉換為Sqlite數(shù)據(jù)庫文件。

      主程序界面設計如下:

      業(yè)務邏輯分析

      主程序調用業(yè)務邏輯層BLL,BLL使用抽象工廠DALFactory方法,DALFactory創(chuàng)建DAO實例對象,接口層IDAL定義數(shù)據(jù)操作接口方法,由數(shù)據(jù)訪問層通過各自的公用數(shù)據(jù)操作類庫進行讀寫數(shù)據(jù)庫,實現(xiàn)對實體類Model的訪問。

      解決方案文件列表如圖

      其中DBUtility為公共數(shù)據(jù)訪問類庫。三個數(shù)據(jù)訪問層SQLServerDAL、SqliteDAL和OleDAL分別對應Sql Server、Sqlite、Access數(shù)據(jù)庫。這里我正在使用的是SqliteDAL。

      具體實現(xiàn)

      建立實體類進行對象封裝

       

      App.config定義選用的DAL及數(shù)據(jù)庫連接信息

      代碼

      <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
      <appSettings>
      <!--<add key="DAL" value="CuteMobileSearch.SQLServerDAL"/>
      <add key="DAL" value="CuteMobileSearch.SQLiteDAL"/>
      <add key="DAL" value="CuteMobileSearch.OleDAL"/>-->
      <!--當前使用DAL;可選以上三者之一,分別對應Sql Server、Sqlite、Access數(shù)據(jù)庫-->
      <add key="DAL" value="CuteMobileSearch.SQLiteDAL"/>
      <add key="SqlConn" value="server=.;database=CuteMobileDB;uid=sa;pwd=123456"/>
      <add key="SqliteFile" value="/App_Data/db.db"/>
      <add key="OleFile" value="/App_Data/mobile.mdb"/>
      </appSettings>
      </configuration>
        SqlConnStr.cs文件用于獲得相應的連接字符串ConnectionString

       代碼

      /// <summary>
      /// 獲得連接字符串ConnectingString
      /// </summary>
      public static class SqlConnString
      {
      public static string ReturnConnString()
      {
      string _appPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//當前程序路徑
      string _dal = System.Configuration.ConfigurationManager.AppSettings["DAL"];//獲取App.Config中DAL
      string _conn = "";
      switch (_dal)
      {
      /*Sqlite數(shù)據(jù)庫*/
      case "CuteMobileSearch.SQLiteDAL":
      default:
      _appPath = "Data Source=" + _appPath;
      _appPath += System.Configuration.ConfigurationManager.AppSettings["SqliteFile"];
      return _appPath;
      /*SqlServer數(shù)據(jù)庫*/
      case "CuteMobileSearch.SQLServerDAL":
      _conn = "server=.;database=CuteMobileDB;uid=sa;pwd=123456";
      return _conn;
      /*access數(shù)據(jù)庫*/
      case "CuteMobileSearch.OleDAL":
      _appPath = "provider=microsoft.jet.oledb.4.0;data source=" + _appPath + System.Configuration.ConfigurationManager.AppSettings["OleFile"];
      return _appPath;
      }
      }
      }

      然后是抽象工廠DAL通過使用反射創(chuàng)建接口對象的實例

      代碼
      /// <summary>
      /// 創(chuàng)建抽象工廠
      /// </summary>
      public sealed class ObjectCreate
      {
      /*所使用程序集*/
      public static readonly string asseblyDAL = System.Configuration.ConfigurationManager.AppSettings["DAL"];

      /// <summary>
      /// 創(chuàng)建對象(不使用緩存:B/S使用)
      /// </summary>
      /// <param name="AssemblyPath"></param>
      /// <param name="classNamespace"></param>
      /// <returns></returns>
      private static object CreateObject(string AssemblyPath, string classNamespace)
      {
      try
      {
      object objType = Assembly.Load(AssemblyPath).CreateInstance(classNamespace);
      return objType;
      }
      catch
      {
      return null;
      }
      }

      /// <summary>
      /// 創(chuàng)建list接口對象
      /// </summary>
      /// <returns></returns>
      public static CuteMobileSearch.IDAL.Ilist CreateListObj()
      {
      string className = asseblyDAL + ".listServices";
      object obj = CreateObject(asseblyDAL, className);
      return (CuteMobileSearch.IDAL.Ilist)obj;
      }
      }

      IDAL聲明數(shù)據(jù)訪問的接口方法

       代碼
      public interface Ilist
      {
          /*添加對象*/
          int Add(CuteMobileSearch.Model.list objList);
          /*返回所有*/
          List<CuteMobileSearch.Model.list> GetAll();
          /*根據(jù)號碼查詢*/
          List<Model.list> GetListByNum(string num);
          /*根據(jù)查詢條件*/
          List<CuteMobileSearch.Model.list> GetListByWhere(string strWhere);
      }

      SqliteDAL繼承IDAL,實現(xiàn)對數(shù)據(jù)庫的訪問和操作,來訪問實體類Model

      代碼
      /// <summary>
      /// 基于Sqlite的數(shù)據(jù)訪問類庫
      /// </summary>
      public class listServices : IDAL.Ilist
      {
      /// <summary>
      /// 添加
      /// </summary>
      /// <returns>返回添加數(shù)目</returns>
      public int Add(CuteMobileSearch.Model.list objList)
      {
      StringBuilder sbSql = new StringBuilder();
      sbSql.Append("INSERT INTO list(");
      sbSql.Append("num,code,city,cardtype)");
      sbSql.Append(" VALUES(");
      sbSql.Append("@num,@code,@city,@cardtype)");
      sbSql.Append(";SELECT @@IDENTITY");
      SQLiteParameter[] paras ={
      new SQLiteParameter("@num",DbType.String,8),
      new SQLiteParameter("@code",DbType.String,8),
      new SQLiteParameter("@city",DbType.String,16),
      new SQLiteParameter("@cardtype",DbType.String,16)
      };
      paras[0].Value = objList.Num;
      paras[1].Value = objList.Code;
      paras[2].Value = objList.City;
      paras[3].Value = objList.Cardtype;
      int num = Wang.DBUtility.SqliteHelper.ExecuteCommand(sbSql.ToString());
      return num;
      }

      /// <summary>
      /// 返回List<>
      /// </summary>
      /// <returns></returns>
      public List<CuteMobileSearch.Model.list> GetAll()
      {
      return GetListByWhere("");
      }

      /// <summary>
      /// 根據(jù)號碼查詢
      /// </summary>
      /// <param name="num"></param>
      /// <returns></returns>
      public List<Model.list> GetListByNum(string num)
      {
      string strWhere = "num LIKE '" + num + "%'";
      return GetListByWhere(strWhere);
      }

      /// <summary>
      /// 根據(jù)條件返回List<>
      /// </summary>
      /// <param name="strWhere"></param>
      /// <returns></returns>
      public List<CuteMobileSearch.Model.list> GetListByWhere(string strWhere)
      {
      List<CuteMobileSearch.Model.list> listList = new List<CuteMobileSearch.Model.list>();
      StringBuilder strSql = new StringBuilder();
      strSql.Append("SELECT * FROM list");
      if (strWhere != "")
      {
      strSql.Append(" WHERE ");
      strSql.Append(strWhere);
      }
      SQLiteDataReader reader = Wang.DBUtility.SqliteHelper.GetReader(strSql.ToString());
      while (reader.Read())
      {
      CuteMobileSearch.Model.list objList = new CuteMobileSearch.Model.list();
      if (reader["id"].ToString() != String.Empty)
      {
      objList.Id = int.Parse(reader["id"].ToString());
      }
      objList.Num = reader["num"].ToString();
      objList.Code = reader["code"].ToString();
      objList.City = reader["city"].ToString();
      objList.Cardtype = reader["cardtype"].ToString();

      listList.Add(objList);
      }
      reader.Close();
      return listList;
      }
      }

      以其中的查詢結果的GetListByNum方法的UML類圖如下

      運行結果

      主程序運行效果如下圖

      查看詳細信息

      總結

      此類基于多數(shù)據(jù)庫操作的應用程序是很常見的,通過使用工廠方法模式進行架構,以業(yè)務邏輯分層、抽象實現(xiàn)數(shù)據(jù)訪問的思想進行開發(fā),顯然在程序的可擴展性、層次性具有較大的優(yōu)勢。

      另一點值得說的是,Sqlite數(shù)據(jù)庫的確在一些應用場合中具有較大的優(yōu)勢,關于Sqlite數(shù)據(jù)庫的介紹請參見此文http://zh.wikipedia.org/wiki/SQLite

      廢話

      我知道這篇文章技術一般,顯然達不到cnblogs的技術層次;我本人的技術水平在cnblogs牛人面前也只是小菜鳥而已,發(fā)到首頁是希望大家多多拍磚,多提寶貴意見,:)

        相關評論

        閱讀本文后您有什么感想? 已有人給出評價!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評論

        最新評論

        發(fā)表評論 查看所有評論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字數(shù): 0/500 (您的評論需要經過審核才能顯示)