亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用Factory Method模式擴展MyMSDNTVLibrary

2019-11-18 12:01:38
字體:
來源:轉載
供稿:網友

  最近又復習了一遍設計模式,我開始重新審閱原有的應用程序結構,發現了一些應該改進的地方。比如說,我在寫MyMSDNTVLibrary的第一個版本時就非常想讓它能夠很方便地支持不同種類的數據源,例如access、SQL Server,甚至是單純的xml.我知道實現起來并不難,但怎樣做才能最有效最有利于代碼復用?想來想去,我決定在數據訪問這一部分應用Factory Method模式。
  
  Factory Method是GOF在Design Pattersn一書中給出的一種模式,GOF為它做出的定義是:
  
  Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
  
  簡單來說,Factory Method的目的是想創建幾個相似的(實現同一接口或繼續同一父類)類中的某一個,為了達到這一目的,需要創建幾個相似的creator類,通過creator類來決定創建哪一個所需的對象類。它的UML圖示如下:
  
  具體到這個項目來說,我需要針對不同的數據源來創建幾個不同的DBHelper(我的個人習慣是通過DBHelper來封裝針對特定的數據源的訪問動作),如OleDBHelper、SqlDBHelper等,這些Helper有非常相近的結構,因此可以讓它們繼續于同一接口——IDBHelper.IDBHelper的定義如下:
  
  using System;
  
  using System.Data;
  
  namespace musicland.MSDNTVLibrary.Component
  
  {
  
  public interface IDBHelper
  
  {
  
  DataSet GetAll();
  
  }
  
  }
  
  注重其中給出了一個有待實現的方法GetAll,通過實現類對該方法的調用,可以獲得應用程序所需的全部數據。
  
  接下來就是從IDBHelper繼續而來的兩個具體數據訪問輔助類。
  
  OleDBHelper:
  
  using System;
  
  using System.Configuration;
  
  using System.Data;
  
  using System.Data.OleDb;
  
  namespace musicland.MSDNTVLibrary.Component
  
  {
  
  // This is the helper class that will interact with OleDB for info.
  
  internal class OleDBHelper: IDBHelper
  
  {
  
  PRivate OleDbConnection conn;
  
  public OleDBHelper()
  
  {
  
  conn=new OleDbConnection(ConfigurationSettings.AppSettings["OleConnectionString"]);
  
  }
  
  public DataSet GetAll()
  
  {
  
  OleDbDataAdapter da=new OleDbDataAdapter("select * from Episode order by Date desc", conn);
  
  DataSet ds=new DataSet();
  
  try
  
  {
  
  da.Fill(ds, "Episode");
  
  }
  
  catch (OleDbException ex)
  
  {
  
  throw ex;
  
  }
  
  finally
  
  {
  
  if (conn.State!=ConnectionState.Closed)
  
  conn.Close();
  
  }
  
  return ds;
  
  }
  
  }
  
  }
  
  SqlDBHelper:
  
  using System;
  
  using System.Configuration;
  
  using System.Data;
  
  using System.Data.SqlClient;
  
  namespace musicland.MSDNTVLibrary.Component
  
  {
  
  // This is the helper class that will interact with SqlServer for info.
  
  internal class SqlDBHelper: IDBHelper
  
  {
  
  SqlConnection conn;
  
  public SqlDBHelper()
  
  {
  
  conn=new SqlConnection(ConfigurationSettings.AppSettings["SqlConncectionString"]);
  
  }
  
  public DataSet GetAll()
  
  {
  
  SqlCommand cmd=new SqlCommand("GetAll", conn);
  
  cmd.CommandType=CommandType.StoredProcedure;
  
  SqlDataAdapter da=new SqlDataAdapter(cmd);
  
  DataSet ds=new DataSet();
  
  try
  
  {
  
  conn.Open();
  
  da.Fill(ds, "Episode");
  
  }
  
  catch (SqlException ex)
  
  {
  
  throw ex;
  
  }
  
  finally
  
  {
  
  if (conn.State!=ConnectionState.Closed)
  
  conn.Close();
  
  }
  
  return ds;
  
  }
  
  }
  
  }
  
  代碼很簡單,分別是針對不同的數據源來獲取Episode表的全部內容(因為這個應用程序所需要的數訪內容非常少,結構也很簡單,因此一張Episode表就足夠了)。其中,針對Access的OleDBHelper我直接使用SQL語句進行查詢,而針對SQL Server的SqlDBHelper里這一部分則改用了存儲過程,這也就非常清楚地體現出了不同數據源的訪問方式的差別。
  
  上面已經把數據訪問輔助類構建完畢,接下來就該創建Creator和ConcreteCreator來動態調用這些輔助類了。OK,創建一個IDBCreatro接口:
  
  using System;
  
  namespace musicland.MSDNTVLibrary.Component
  
  {
  
  public interface IDBCreator
  
  {
  
  IDBHelper CreateDBHelper();
  
  }
  
  }
  
  通過實現該接口,我們可以獲得用于創建不同的數據訪問輔助類的具體類:
  
  OleDBCreator:
  
  using System;
  
  namespace musicland.MSDNTVLibrary.Component
  
  {
  
  // This is the ConcreteCreator class that helps to
  
  // create and return the OleDBHelper class.
  
  public class OleDBCreator: IDBCreator
  
  {
  
  public OleDBCreator() {}
  
  public IDBHelper CreateDBHelper()
  
  {
  
  return new OleDBHelper();
  
  }
  
  }
  
  }
  
  SqlDBCreator:
  
  using System;
  
  namespace musicland.MSDNTVLibrary.Component
  
  {
  
  // This is the ConcreteCreator class helps to
  
  // create and return the SqlDBHelper class.
  
  public class SqlDBCreator: IDBCreator
  
  {
  
  public SqlDBCreator() {}
  
  public IDBHelper CreateDBHelper()
  
  {
  
  return new SqlDBHelper();
  
  }
  
  }
  
  }
  
  以上兩個類均實現了IDBCreator接口。通過實現CreateDBHelper方法,就可以創建一個數據訪問輔助類(OleDBHelper或SqlDBHelper)的實例并傳回調用方,這正是我們所需要的。
  
  OK,主要框架已經搭建完畢,接下來我們只要在應用程序中通過適當的邏輯來進行調用了。我的初步設想是在。config文件中增加一個自定義的DBType鍵,通過為DBType設值來決定應用程序需要哪一種數據訪問方式。配置文件部分內容如下:
  
  <appSettings>
  
  Note: DBType indicates which DB need to interact with.
  
  currently:
  
  0: SqlServer
  
  1: OleDB
  
  ——>
  
  <add key="DBType" value="1" />
  
  <add key="OleConnectionString" value="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=MSDNTV.mdb;" />
  
  <add key="SqlConncectionString" value="Server=(local); Database=MyMSDNTVLibrary; Integrated Security=SSPI" />
  
  ……
  
  </appSettings>
  
  設置好DBType以后,我們要做的只是在應用程序中讀出這一配置值,然后去創建相應的DBCreator即可,代碼如下:
  
  // Get the corresponding IDBCreator class
  
  public static IDBCreator GetDBCreator()
  
  {
  
  int dbType=Convert.ToInt32(ConfigurationSettings.AppSettings["DBType"]);
  
  switch (dbType)
  
  {
  
  case 0:
  
  return new SqlDBCreator();
  
  case 1:
  
  return new OleDBCreator();
  
  default:
  
  return new OleDBCreator();
  
  }
  
  }
  
  以上代碼可返回一個實現了IDBCreator接口的具體DBCreator,即OleDBCreator或SqlDBCreator,通過調用該類所實現的CreateDBHelper方法即可獲得應用程序所需的DBHelper:
  
  // Get the corresponding IDBHelper class
  
  public static IDBHelper GetDBHelper(IDBCreator dbCreator)
  
  {
  
  return dbCreator.CreateDBHel

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久中文字幕视频| 九九精品在线播放| 欧美午夜精品在线| 影音先锋日韩有码| 国产欧美亚洲精品| 欧美国产欧美亚洲国产日韩mv天天看完整| 午夜精品福利电影| 欧美成人免费小视频| 在线亚洲国产精品网| 亚洲 日韩 国产第一| 亚洲精品美女在线观看| 国产a∨精品一区二区三区不卡| 国产在线a不卡| 91精品视频免费观看| 亚洲电影免费观看高清完整版在线观看| 久久99热精品这里久久精品| 亚洲自拍偷拍视频| 亚洲精品成a人在线观看| 国产噜噜噜噜久久久久久久久| 亚洲欧美另类在线观看| 午夜伦理精品一区| 久久久久中文字幕2018| 亚洲国产精品成人一区二区| 欧美日韩成人在线视频| 尤物yw午夜国产精品视频| 欧美激情欧美激情在线五月| 欧美激情aaaa| 国内精品久久久久久久久| 久久久久成人精品| 欧美另类老女人| 91久久精品国产91性色| 国产亚洲精品成人av久久ww| 精品网站999www| 毛片精品免费在线观看| 久久久久久久激情视频| 国产精品旅馆在线| 亚洲人免费视频| 成人精品久久av网站| 欧美午夜精品在线| 欧美华人在线视频| 亚洲图片在线综合| 精品国产一区久久久| 国产精品视频久久久久| 91国自产精品中文字幕亚洲| 亚洲一区美女视频在线观看免费| 人人澡人人澡人人看欧美| 精品香蕉一区二区三区| 成年无码av片在线| 国产视频自拍一区| 国产精品美女久久| 国产在线播放不卡| 日韩中文av在线| 日韩在线播放av| 91网在线免费观看| 国产精品入口免费视频一| 奇米一区二区三区四区久久| 欧美黑人视频一区| 91成人国产在线观看| 精品久久久国产| 久久久久久久爱| 综合久久五月天| 日韩欧美高清在线视频| 黄色成人av网| 国产精品电影在线观看| 成人免费视频xnxx.com| 久久久国产精彩视频美女艺术照福利| 久久久久久久国产精品视频| 亚洲人成77777在线观看网| 亚洲欧美国内爽妇网| 原创国产精品91| 成人两性免费视频| 亚洲久久久久久久久久| 一本大道亚洲视频| 久久久噜噜噜久久中文字免| 国产综合在线看| 成人黄色大片在线免费观看| 26uuu国产精品视频| 亚洲人成啪啪网站| 国产精品网址在线| 精品国产一区av| 日韩av片永久免费网站| 欧美美女操人视频| 久久久久久久久久久国产| 国产在线a不卡| 成人免费网站在线观看| 好吊成人免视频| 成人性生交大片免费看视频直播| 成人av资源在线播放| 91色p视频在线| 精品亚洲aⅴ在线观看| 最近日韩中文字幕中文| 色偷偷888欧美精品久久久| 久久久久久久久亚洲| 国产欧美一区二区白浆黑人| 亚洲第一福利在线观看| 亚洲a中文字幕| 成人福利视频网| 成人免费网站在线观看| 性色av香蕉一区二区| 日日骚av一区| 亚洲视频视频在线| 日韩精品亚洲视频| 欧美大荫蒂xxx| 亚洲欧美日韩国产成人| 黑人巨大精品欧美一区二区免费| 永久免费精品影视网站| 国产欧美一区二区三区久久人妖| 韩国三级日本三级少妇99| 亚洲视频一区二区| 成人福利视频网| 亚洲第一区中文字幕| 欧美福利视频在线观看| 久久久久久久国产精品视频| 欧美裸体视频网站| 亚洲级视频在线观看免费1级| 日韩欧美亚洲成人| 欧美激情一区二区三区久久久| 一本色道久久88综合日韩精品| 另类少妇人与禽zozz0性伦| 欧美激情免费观看| 国产suv精品一区二区| 91av在线看| 亚洲美女喷白浆| 91精品美女在线| 97精品视频在线观看| 岛国视频午夜一区免费在线观看| 成人黄色大片在线免费观看| 国产欧美日韩免费看aⅴ视频| 亚洲男人的天堂网站| 九九热在线精品视频| 欧美激情精品久久久久久蜜臀| 成人性生交大片免费观看嘿嘿视频| 亚洲第一av网| 日本精品久久中文字幕佐佐木| 成人深夜直播免费观看| 亚洲国产美女精品久久久久∴| 亚洲最大的网站| 日韩网站在线观看| 成人两性免费视频| 欧美一级大片在线观看| 美女视频黄免费的亚洲男人天堂| 亚洲国产精品美女| 国产在线精品成人一区二区三区| 伊人久久大香线蕉av一区二区| 日韩亚洲欧美中文在线| 久久成年人视频| 97精品免费视频| 国产美女直播视频一区| 91精品国产综合久久香蕉922| 欧美日韩国产成人在线| 中文精品99久久国产香蕉| 中日韩午夜理伦电影免费| 精品久久久久久久久久久| 欧美激情精品久久久久久蜜臀| 欧美激情2020午夜免费观看| 亚洲男人的天堂网站| 理论片在线不卡免费观看| 亚洲精品一区二区三区婷婷月| 成人网在线观看| 欧美性猛交xxxx偷拍洗澡| 国产精品美女呻吟| 成人久久精品视频| 亚洲国产免费av| 成人免费观看a|