一、UML圖
二、包含的角色
(1)抽象工廠
(2)具體工廠:包括具體工廠1和具體工廠2。具體工廠1用於生產具體產品A1和具體產品B1,具體工廠2用於生產具體產品A2和具體產品B2;
(3)抽象產品:包括抽象產品A和抽象產品B;
(4)具體產品:包括抽象產品A所對應的具體產品A1和A2,以及抽象產品B所對應的具體產品B1和B2.
說明:在《大話設計模式》中,上述的1和2分別代表Sqlserver數據庫和Access數據庫。上述的A和B分別代表數據庫中的User表和Department表。
三、優勢
(1)抽象工廠模式是對工廠方法模式的改進。用於處理產品不只有一類的情況(工廠方法模式下,產品只有User這一類,而抽象工廠模式下,產品包括User和Department兩類)。
(2)在以下情況下應當考慮使用抽象工廠模式:
一個系統不應當依賴於產品類實例如何被創建、組合和表達的細節,這對於所有形態的工廠模式都是重要的。這個系統有多於一個的產品族,而系統只消費其中某一產品族。同屬於同一個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。系統提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於實現。(3)解讀:在上例中,產品族包括兩個:1和2,也就是Sqlserver數據庫和Access數據庫。每個產品族裡面又包含兩類產品:A和B,也就是User表和Department表。而每個產品族中的產品要一起使用,就是說產品族1中的兩類產品A和B要一起使用,也就是說在SqlServer數據庫中SqlServerUser表和SqlServerDepartment表要一起使用,Access數據庫同理。
四、C++實現
#include#include using namespace std; //數據庫表項:User class User { private: int id; string name; public: int getID() { return id; } string getName() { return name; } void setID(int ID) { this->id=ID; } void setName(string NAME) { this->name=NAME; } }; //數據庫表項:Department class Department { private: int id; string name; public: int getID() { return id; } string getName() { return name; } void setID(int ID) { this->id=ID; } void setName(string NAME) { this->name=NAME; } }; //抽象產品A:IUser class IUser { public: virtual void Insert(User user)=0; virtual User* GetUser(int id)=0; }; //具體產品A1:SqlserverUser class SqlserverUser:public IUser { public: void Insert(User user) { cout<<"在SQL Server中給User表增加了一條記錄"< CreateUser(); iu->Insert(user); iu->GetUser(1); IDepartment* id=factory->CreateDepartment(); id->Insert(department); id->GetDepartment(1); system("pause"); }