大話設計模式C++實現-第15章-抽象工廠模式
阿新 • • 發佈:2019-02-13
一、UML圖
二、概念
抽象方法模式(Abstract Factory):提供一個建立一系列相關或互相依賴物件的介面,而無需指定他們具體的類。
三、包含的角色
(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++實現
(1)程式碼
#include <iostream> #include <cstdlib> 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表增加了一條記錄"<<endl; } User* GetUser(int id) { cout<<"在SQL Server中根據ID得到User表一條記錄"<<endl; return NULL; } }; //具體產品A2:AccessUser class AccessUser:public IUser { public: void Insert(User user) { cout<<"在Access中給User表增加了一條記錄"<<endl; } User* GetUser(int id) { cout<<"在Access中根據ID得到User表一條記錄"<<endl; return NULL; } }; //抽象產品B:IDepartment class IDepartment { public: virtual void Insert(Department department)=0; virtual Department* GetDepartment(int id)=0; }; //具體產品B1:SqlserverDepartment class SqlserverDepartment:public IDepartment { public: void Insert(Department department) { cout<<"在Sql Server中給Department表添加了一條記錄"<<endl; } Department* GetDepartment(int id) { cout<<"在SQL Server中根據ID得到Department表的一條記錄"<<endl; return NULL; } }; //具體產品B2:AccessDepartment class AccessDepartment:public IDepartment { public: void Insert(Department department) { cout<<"在Access中給Department表添加了一條記錄"<<endl; } Department* GetDepartment(int id) { cout<<"在Access中根據ID得到Department表的一條記錄"<<endl; return NULL; } }; //抽象工廠:IFactory class IFactory { public: virtual IUser* CreateUser()=0; virtual IDepartment* CreateDepartment()=0; }; //具體工廠1:SqlServerFactory class SqlserverFactory:public IFactory { public: IUser* CreateUser() { return new SqlserverUser; } IDepartment* CreateDepartment() { return new SqlserverDepartment; } }; //具體工廠2:AccessFactory class AccessFactory:public IFactory { public: IUser* CreateUser() { return new AccessUser; } IDepartment* CreateDepartment() { return new AccessDepartment; } }; //客戶端 void main() { User user; Department department; //ConcreteFactory1 IFactory* factory=NULL; factory=new SqlserverFactory; //ProductA1 IUser* iu=NULL; iu=factory->CreateUser(); iu->Insert(user); iu->GetUser(1); //ProductB1 IDepartment* id=NULL; id=factory->CreateDepartment(); id->Insert(department); id->GetDepartment(1); if(factory!=NULL) { delete factory; factory=NULL; } if(iu!=NULL) { delete iu; iu=NULL; } if(id!=NULL) { delete id; id=NULL; } system("pause"); }
(2)執行截圖