定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類
在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();
你也要更改多個地方
去除ifactory、sqlserve***ctory和accessfactory三個工廠類
使用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 設計模式之工廠方法模式 一文中我們提到,由於簡單工廠模式當中的工廠類職責過重,嚴重違反了單一職責的原則,導致系統擴充套件十分困難,於是引出了工廠方法模式,工廠方法模式引入抽象的工廠類,具體的建立工作推遲到每個具體的工廠類中,這樣每個具體工廠類只負責一種產品的建立,這樣每個具體工廠類的職責就足...