3.抽象工厂模式
1抽象工廠模式的核心內容是:
A:消費者分離,分別用不同的類實現(包含抽象類和實現類)
B:操作分離,分別用不同的類實現(包含抽象類和實現類)
C:使用工廠類使消費者類和操作類關聯起來,有總線的功能。
2抽象工廠模式的作用:使用工廠將分別獨立的消費者和實際的操作關聯起來。
3抽象工廠模式具體描述
工廠模式:客戶類和工廠類分開。
消費者任何時候需要某種產品,只需向工廠請求即可。
?
消費者無須修改就可以接納新產品。缺點是當產品修改時,
?
工廠類也要做相應的修改。如:如何創建及如何向客戶端提供。
?
追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,
雖然口味有所不同,但不管你帶MM去麥當勞或肯德基,
只管向服務員說“來四個雞翅”就行了。麥當勞和肯德基就是生產雞翅的Factory。
?
消費者不固定,工廠者不固定,(工廠根據消費者動作)
?
實現消費者抽象基類,消費者派生類的實現,實例化就是消費者
?
操作的抽象基類,實現派生類各種操作,實例化的操作
?
工廠的抽象類,抽象類包含了兩個抽象類的接口(消費者,操作)
抽象類實現了工廠類的抽象,實例化的派生類,實現工廠,
根據用戶設置用戶,根據操作設置操作
4.策略模式類圖
5.代碼:
#include<iostream>
#include <string>
?
using namespace std;
?
//工廠模式:客戶類和工廠類分開。
//消費者任何時候需要某種產品,只需向工廠請求即可。
?
//消費者無須修改就可以接納新產品。缺點是當產品修改時,
?
//工廠類也要做相應的修改。如:如何創建及如何向客戶端提供。
//
//追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,
//雖然口味有所不同,但不管你帶MM去麥當勞或肯德基,
//只管向服務員說“來四個雞翅”就行了。麥當勞和肯德基就是生產雞翅的Factory。
?
//消費者不固定,工廠者不固定,(工廠根據消費者動作)
?
//實現消費者抽象基類,消費者派生類的實現,實例化就是消費者
?
//操作的抽象基類,實現派生類各種操作,實例化的操作
?
//工廠的抽象類,抽象類包含了兩個抽象類的接口(消費者,操作)
//抽象類實現了工廠類的抽象,實例化的派生類,實現工廠,
//根據用戶設置用戶,根據操作設置操作
?
class IUser
{
public:
??? //純虛接口類,抽象類
??? virtual void getUser() = 0;
??? virtual void setUser() = 0;
};
?
//繼承抽象實現sql數據庫使用者的實例化
class SqlUser :public IUser
{
public:
??? void getUser()
??? {
??????? cout << "在sql中返回user" << endl;
??? }
??? void setUser()
??? {
??????? cout << "在sql中設置user" << endl;
??? }
};
?
//繼承抽象實現access數據使用者的實例化
class AccessUser :public IUser
{
public:
??? void getUser()
??? {
??????? cout << "在Access中返回user" << endl;
??? }
??? void setUser()
??? {
??????? cout << "在Access中設置user" << endl;
??? }
};
?
//抽象類,提供接口
class IDepartment
{
public:
??? virtual void getDepartment() = 0;
??? virtual void setDepartment() = 0;
};
?
//SQL操作的實現
class SqlDepartment :public IDepartment
{
public:
??? void getDepartment()
??? {
??????? cout << "在sql中返回Department" << endl;
??? }
??? void setDepartment()
??? {
??????? cout << "在sql中設置Department" << endl;
??? }
};
?
//access操作的實現
class AccessDepartment :public IDepartment
{
public:
??? void getDepartment()
??? {
??????? cout << "在Access中返回Department" << endl;
??? }
??? void setDepartment()
??? {
??????? cout << "在Access中設置Department" << endl;
??? }
};
?
//抽象工廠
class IFactory
{
public:
??? virtual IUser *createUser() = 0;
??? virtual IDepartment *createDepartment() = 0;
};
?
//抽象工廠一個實現
class SqlFactory :public IFactory
{
public:
??? IUser *createUser()
??? {
??????? return new SqlUser();
??? }
??? IDepartment *createDepartment()
??? {
??????? return new SqlDepartment();
??? }
};
?
//抽象工廠一個實現
class AccessFactory :public IFactory
{
public:
??? IUser *createUser()
??? {
??????? return new AccessUser();
??? }
??? IDepartment *createDepartment()
??? {
??????? return new AccessDepartment();
??? }
};
?
//變相的實現了靜態類
class DataAccess
{
private:
??? static string db;
??? //string db="access";
public:
??? static IUser *createUser()
??? {
??????? if (db == "access")
??????? {
??????????? return new AccessUser();
??????? }
??????? else if (db == "sql")
??????? {
??????????? return new SqlUser();
??????? }
??? }
??? static IDepartment *createDepartment()
??? {
??????? if (db == "access")
??????? {
??????????? return new AccessDepartment();
??????? }
??????? else if (db == "sql")
??????? {
??????????? return new SqlDepartment();
??????? }
??? }
};
string DataAccess::db = "sql";
?
int main()
{
??? //IFactory *factory=new SqlFactory();
??? IFactory *factory;//抽象工廠
??? IUser *user;//抽象消費者
??? IDepartment *department;//提供的操作
?
??? factory = new AccessFactory();//基類的指針指指向派生類的對象
??? user = factory->createUser();//基類的指針指向派生類的對象
??? department = factory->createDepartment();//基類的指針指向派生類的對象
?
??? user->getUser();
??? user->setUser();//訪問acesss接口
?
??? department->getDepartment();
??? department->setDepartment();//接口
?
??? cout << "--------------------" << endl;
?
??? user = DataAccess::createUser();
??? department = DataAccess::createDepartment();
?
??? user->getUser();
??? user->setUser();
??? department->getDepartment();
??? department->setDepartment();
?
??? cin.get();
??? return 0;
}
運行結果如下:
總結