關於工廠模式的資料庫元件的反編譯解讀

2021-09-07 22:17:19 字數 1511 閱讀 2904

工廠模式:

gof:定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。factory method使乙個類的例項化延遲到其子類。

簡單就來就是你放什麼菜入鍋,加入油鹽醬醋就會端上來什麼菜來。

現在,由於對將來可能出現的資料移植問題而產生的資料庫連線以及相關類的引用(如sql server應引用system.data.sqlclient; oracle應引用system.data.oracleclient;當然還有直接用oledb物件的。這時候資料移植產生了巨大的**變更。

我們需要做的,就是公開出乙個統一的介面,傳入datasource後,自動在元件裡進行處理並給出適合這種類的方法。我們可以用到工廠方法模式。

我們專案現在引入了乙個非常簡單並且非常典型的資料元件,我用reflector反編譯了一下,**寫得也沒有什麼意外的。

公開的介面為database,並定義了以下方法(當然這些方法目前為止是不夠d)

public inte***ce database

其下分別有三個派生類:oledb,oracle,sqlserver,且分別實現了介面中的方法。

幷包含了自身的私有方法:如open(),close(),以及connstr,conn等屬性。

此外,元件中還定義了乙個public的類:dataaccess;此類只有乙個方法

public static database databasecreate(string datasourcename);

傳入資料來源的名稱,並根據此名稱,使用類的私有方法private static dataaccess.dblink getdblink(string datasourcename)

來返回對應的派生類的例項化物件;不難相象getdblink()方法無非是一些switch之類的,根據資料來源名判斷資料庫型別之類的**。

當然,我們也可以統一在乙個xml配置檔案裡進行統一配置,而無需對**本身進行任何修改。

附:class

dataaccess

public

string

dbstring 

public

intdbtype 

//fields

private

string

_dbkey;

private

string

_dbstring;

private

int_dbtype;

private

enum

dbproduct

判斷具體實現什麼派生類:

dblink(

string

skey)

this

.dbkey ="

public";

this

.dbtype 

=convert.toint32(dataaccess.dbproduct.oracle);

this

.dbstring ="

password=; user id=; data source=datasrcname";

關於資料庫訪問元件

這個應該是最開始的想法,首先定義好訪問時候使用的資料結構,使用三個abstract class做為介面,各個層次的訪問 如下 抽象類 struct idataset struct itable struct irow 中間層的訪問 idataset pds itable ptbl irow prow...

工廠模式 反射 ? 靈活多變的資料庫

工廠模式 反射 靈活多變的資料庫麼 由於現實專案中我們難保會客戶會更換系統的資料庫,這樣我們需要把若干資料庫各種情況基本上都想到。多種資料庫,引出抽象,我們就能在眾多資料庫的上層抽出乙個factory,由factory去引導具體例項哪種資料庫。以上其實就是我們今天要說的抽象工廠。那麼,反射是什麼呢?...

工廠模式連線資料庫

在專案中通常可能會使用不同的資料來源,可能是sql server也可能是access或者是oracle,那麼如何保證在使用不同資料來源的時候,使專案 更改的代價最小呢?對,使用工廠模式.在net1.1的時候,這需要專案實施者自己來完成.在net2.0中,ms已經新增了幾個用於實施工廠模式的類庫.首先...