C 設計模式之 抽象工廠模式與反射

2021-08-28 02:21:53 字數 4589 閱讀 7374

定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類

在access中給user表增加一條記錄

在access中根據id得到user表一條記錄

提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類

class department

public

string id

}

inte***ce

idepartment

class sqlserverdepartment : idepartment

public department getdepartment(int id)

}

class accessdepartment : idepartment

public

void

insert(department department)

}

class sqlserve***ctory : ifactory

public idepartment createdepartment()

}

class accessfactory : ifactory

public idepartment createdepartment()

}

// test

user user = new user();

department dept = new department();

//ifactory factory = new sqlserve***ctory();

ifactory factory = new accessfactory();

iuser iu = factory.createuser();

iu.insert(user);

iu.getuser(1);

idepartment id = factory.createdepartment();

id.insert(dept);

id.getdepartment(1);

// result

在access中給user表增加一條記錄

在access中根據id得到user表一條記錄

在access中給department表增加一條記錄

在access中根據id得到department表一條記錄

ifactory 就是乙個抽象工廠介面,它裡面應該包含所有的產品建立的抽象方法

通常在執行時再建立乙個concretefactory類的例項,這個具體的工廠再建立具有特定實現的產品物件,也就是說為建立不同的產品物件,客戶商應使用不同的具體工廠

優點便於交換系列產品,由於具體工廠類,在乙個應用中只需要在初始化時出現一次,這使得改變乙個應用的具體工廠變得很容易,它只要改變具體工廠即可使用不同的產品配置

它讓具體的建立例項過程與客戶端分離,客戶端是通過它們的抽象介面操縱例項,產品的具體類名也被具體的工廠實現分離,不會出現在客戶**中

缺陷1,新增新的表,要更改多個工廠類

2,程式中有多個地方使用了

ifactory factory =new accessfactory();
現在換個資料庫

ifactory factory =new sqlserve***ctory();
你也要更改多個地方

去除ifactorysqlserve***ctoryaccessfactory三個工廠類

使用dataaccess類取代它們

在sql server中給user表增加一條記錄

在sql server中根據id得到user表一條記錄

在sql server中給department表增加一條記錄

在sql server中根據id得到department表一條記錄

這裡使用了簡單工廠的方法來解決了上面的缺陷,但同時又產生了新的問題(switch問題)

如果要新增oracle資料庫,抽象工廠本來只要增加乙個oraclefactory工廠即可,這裡簡單工廠要修改switch增加case

using system.reflection

;assembly.load("程式集名稱").createinstance("命名空間.類的名稱");

// 常規寫法

iuser result = new sqlserveruser();

// 反射寫法

using system.reflection;

iuser result = (iuser)assembly.load("抽象工廠模式").createinstance("抽象工廠模式.sqlserveruser");

使用反射的具體**

using system.reflection;

class dataaccess

public

static idepartment createdepartment()

}

上述**同樣得到了結果

如果我們增加了oracle資料訪問,相關的類的增加是不可避免的,不過這叫擴充套件,開閉原則告訴我們對於擴充套件開放,對於修改關閉

我們只要修改db字串變數的值為

// private static readonly string db = "abstractpattern.oracle";
每次更換資料庫時還是要修改程式修改db值重編譯,如果可以不修改程式,才是真正的開放-封閉原則

解決方案:使用配置檔案

C 設計模式之抽象工廠模式

抽象工廠模式 比工廠模式具有更高層次的抽象性,當要返回一系列相關類中的某一格,而對每個類都能根據需要返回不同的物件時候,這種模式就派上了用場。換言之,抽象工廠是乙個工廠物件。它能返回一系列相關類中的某一格,可以用簡單工廠決定哪乙個類。下面這個例子作為抽象工廠模式的例子,希望能跟大家一起分享一起進步。...

c 設計模式之 抽象工廠模式

概念 抽象工廠模式提供了乙個建立相似或相關相互依賴的物件,而不需要說明其具體的實現.類結構圖 圖來自 wiki 示例 include class button class winbutton public button class macbutton public button class scro...

C 設計模式之抽象工廠模式

在 c 設計模式之工廠方法模式 一文中我們提到,由於簡單工廠模式當中的工廠類職責過重,嚴重違反了單一職責的原則,導致系統擴充套件十分困難,於是引出了工廠方法模式,工廠方法模式引入抽象的工廠類,具體的建立工作推遲到每個具體的工廠類中,這樣每個具體工廠類只負責一種產品的建立,這樣每個具體工廠類的職責就足...