国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

用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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 渭南市| 林甸县| 尼玛县| 金秀| 铁岭县| 安新县| 商水县| 滨州市| 河北省| 鄂州市| 乐业县| 浦县| 祁东县| 宁乡县| 昌邑市| 乌兰察布市| 谢通门县| 团风县| 花莲市| 临朐县| 崇阳县| 岳阳市| 始兴县| 溆浦县| 永宁县| 宣恩县| 永定县| 盐边县| 泽普县| 稻城县| 普格县| 宜春市| 阳城县| 东乡族自治县| 临颍县| 久治县| 宕昌县| 孝义市| 汤原县| 柳州市| 莱西市|