C++設計模式——抽象工廠
阿新 • • 發佈:2022-02-23
抽象工廠: 提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。
#include<iostream> using namespace std; class Department // 抽象產品Department ,定義具體產品的公共介面 { public: virtual ~Department() = default; virtual void Insert() = 0; virtual Department* GetDepartment() = 0; }; // 建立具體產品類SqlserDepartment, 定義生產的具體產品; classSqlserDepartment :public Department { public: void Insert()override { cout << "在SQL Server 中給 Department 表增加一條記錄!" << endl; } Department* GetDepartment()override { cout << "在SQL Server 中根據ID 得到 Department 表一條記錄!" << endl; return nullptr; } };// 建立具體產品類AccessDepartment, 定義生產的具體產品; class AccessDepartment : public Department { public: void Insert()override { cout << "在 Access 中給 Department 表增加一條記錄!" << endl; } Department* GetDepartment()override { cout << "在 Access 中根據ID 得到 Department 表一條記錄!" << endl; return nullptr; } }; class User // 抽象產品User ,定義具體產品的公共介面 { public: virtual ~User() = default; virtual void Insert() = 0; virtual User* GetUser() = 0; }; // 建立具體產品類SqlserverUser, 定義生產的具體產品; class SqlserverUser :public User { public: void Insert()override { cout << "在SQL Server 中給 User表增加一條記錄!" << endl; } User* GetUser()override { cout << "在SQL Server 中根據ID 得到 User表一條記錄!" << endl; return nullptr; } }; // 建立具體產品類AccessUser, 定義生產的具體產品; class AccessUser :public User { public: void Insert()override { cout << "在 Access 中給 User表增加一條記錄!" << endl; } User* GetUser()override { cout << "在 Access 中根據ID 得到 User表一條記錄!" << endl; return nullptr; } }; class AbstractFactory // 抽象工廠,定義具體工廠的公共介面 { public: virtual ~AbstractFactory() = default; virtual User* CreateUser() = 0; virtual Department* CreateDepartment() = 0; }; // 建立具體工廠SqlServerFactory,定義建立對應具體產品例項的方法; class SqlServerFactory :public AbstractFactory { public: User* CreateUser()override { return new SqlserverUser(); // 該工廠 生產的產品 } Department* CreateDepartment()override { return new SqlserDepartment; } }; // 建立具體工廠AccessFactory,定義建立對應具體產品例項的方法; class AccessFactory :public AbstractFactory { public: User* CreateUser()override { return new AccessUser(); // 該工廠 生產的產品 } Department* CreateDepartment()override { return new AccessDepartment; } }; int main() { // AbstractFactory *factory = new SqlServerFactory; AbstractFactory* factory = new AccessFactory; User* iu = factory->CreateUser(); // 呼叫的是 AccessFactory 工廠,準備生產 SqlserverUser 產品 iu->Insert(); iu->GetUser(); Department* id = factory->CreateDepartment(); // 呼叫的是 AccessFactory 工廠,準備生產 AccessDepartment 產品 id->Insert(); id->GetDepartment(); delete factory; delete iu; delete id; factory = nullptr; id = nullptr; id = nullptr; system("pause"); return 0; }
優點
最大的好處是 易於交換產品系列。
由於具體工廠類只需要在初始化的時候出現一次,這就使得改變一個應用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同的產品配置。
第二大好處是,它讓具體的建立例項過程與客戶端分離,客戶端是通過它們的抽象介面操縱例項,產品的具體類名也被具體工廠的實現分離,不會出現在客戶程式碼中。
缺點
增加功能時,要改許多類