C 設計模式之簡單工廠篇

2021-04-01 18:21:09 字數 1960 閱讀 4395

案例】公司準備開發一套產品訂單系統,客戶強烈要求該系統能適應不同的資料庫,即能讓客戶十分方便的決定到底是用

sqlserver

資料庫還是

oracle

資料庫,或者其它資料庫,而且資料庫切換應該簡單,決不能讓客戶麻煩得手忙腳亂。

遇到這種情況,最愚蠢的辦法就是開發不同資料庫版本的系統,即一套

sqlserver

版的訂單系統,一套

oracle

版的訂單系統,但要真是這樣幹的話,我相信專案經理一定會獲得千古蠢名。

「具體情況具體分析」,此時如果設計模式運用得恰到好處,省時、省力的高效軟體工程就會立馬出爐,且看我如何過招。

首先定義乙個介面,具體名為

idatabase,

在這個介面中,定義好資料庫操作的方法名和引數,以及返回值,本案例中我定義如下方法:

public

inte***ce idatabase

然後就是編寫具體的實現類了,客戶要求多少不同型別的資料庫,你就定義多少個idatabase的實現類,雖然工作量大了點,可當你看到客戶滿意的笑容時,你心裡也就會有一種由衷的幸福感,好了,sqlserver實現類**如下:

public

class sqlserver : idatabase

catch(sqlexception) }

public

bool open()

catch(sqlexception) }

public

bool command(string sql)

catch(sqlexception) }

public

void close() }

呵呵,有點長,咬著牙讀完,心裡明白了就會很舒服的,如果你現在有這種感覺了,好,再接再厲,再為oracle實現類編寫具體**吧,依葫蘆畫瓢,大家有空就畫一下吧,我就畫個雛形了:

public

class oracle : idatabase

public

bool connect(string connectstring)

public

bool open()

public

bool command(string sql)

public

void close() }

嗯,不錯,你有多少種資料庫就編寫不同的實現類**吧,這裡就不贅述了,接下來呢?聰明的讀者一定會想到這個問題:這個介面和這麼多的實現類怎麼用啊?我們再定義乙個稱之為工廠的類,由它來決定選用哪種資料庫為進行操作,這個模擬較簡單:

public

class factory }

} 看明白了嗎?好了,我們該讓尊敬的、永遠高貴的客戶出場了,只有他,唯有他才有決定用哪種資料庫的最高許可權,你看,他這樣用:

public

class client

can't be connected.",dbtype);

return;

} //open database.

if(db.open()==false)

can't be opened, the connect string is .",dbtype,dbconnectstring);

return;

} //execute sql command.

string sql = "update order set price = price * 0.07 where productid = '002'";

if(db.command(sql))

else

",sql);

db.close();

return;

} db.close();

} }

好了,工程峻工了,你們明白了沒有?

思考題:簡單工廠的應用場合和侷限性?待續…

哈哈哈~~~jerry

C 設計模式之簡單工廠篇

首先定義乙個介面,具體名為idatabase,在這個介面中,定義好資料庫操作的方法名和引數,以及返回值,本案例中我定義如下方法 public inte ce idatabase catch sqlexception public bool open catch sqlexception public...

C 設計模式之簡單工廠篇

首先定義乙個介面,具體名為idatabase,在這個介面中,定義好資料庫操作的方法名和引數,以及返回值,本案例中我定義如下方法 public inte ce idatabase catch sqlexception public bool open catch sqlexception public...

C 設計模式之簡單工廠篇

首先定義乙個介面,具體名為idatabase,在這個介面中,定義好資料庫操作的方法名和引數,以及返回值,本案例中我定義如下方法 public inte ce idatabase catch sqlexception public bool open catch sqlexception public...