3.抽象工厂模式
1抽象工廠模式的核心內(nèi)容是:
A:消費(fèi)者分離,分別用不同的類實(shí)現(xiàn)(包含抽象類和實(shí)現(xiàn)類)
B:操作分離,分別用不同的類實(shí)現(xiàn)(包含抽象類和實(shí)現(xiàn)類)
C:使用工廠類使消費(fèi)者類和操作類關(guān)聯(lián)起來(lái),有總線的功能。
2抽象工廠模式的作用:使用工廠將分別獨(dú)立的消費(fèi)者和實(shí)際的操作關(guān)聯(lián)起來(lái)。
3抽象工廠模式具體描述
工廠模式:客戶類和工廠類分開(kāi)。
消費(fèi)者任何時(shí)候需要某種產(chǎn)品,只需向工廠請(qǐng)求即可。
?
消費(fèi)者無(wú)須修改就可以接納新產(chǎn)品。缺點(diǎn)是當(dāng)產(chǎn)品修改時(shí),
?
工廠類也要做相應(yīng)的修改。如:如何創(chuàng)建及如何向客戶端提供。
?
追MM少不了請(qǐng)吃飯了,麥當(dāng)勞的雞翅和肯德基的雞翅都是MM愛(ài)吃的東西,
雖然口味有所不同,但不管你帶MM去麥當(dāng)勞或肯德基,
只管向服務(wù)員說(shuō)“來(lái)四個(gè)雞翅”就行了。麥當(dāng)勞和肯德基就是生產(chǎn)雞翅的Factory。
?
消費(fèi)者不固定,工廠者不固定,(工廠根據(jù)消費(fèi)者動(dòng)作)
?
實(shí)現(xiàn)消費(fèi)者抽象基類,消費(fèi)者派生類的實(shí)現(xiàn),實(shí)例化就是消費(fèi)者
?
操作的抽象基類,實(shí)現(xiàn)派生類各種操作,實(shí)例化的操作
?
工廠的抽象類,抽象類包含了兩個(gè)抽象類的接口(消費(fèi)者,操作)
抽象類實(shí)現(xiàn)了工廠類的抽象,實(shí)例化的派生類,實(shí)現(xiàn)工廠,
根據(jù)用戶設(shè)置用戶,根據(jù)操作設(shè)置操作
4.策略模式類圖
5.代碼:
#include<iostream>
#include <string>
?
using namespace std;
?
//工廠模式:客戶類和工廠類分開(kāi)。
//消費(fèi)者任何時(shí)候需要某種產(chǎn)品,只需向工廠請(qǐng)求即可。
?
//消費(fèi)者無(wú)須修改就可以接納新產(chǎn)品。缺點(diǎn)是當(dāng)產(chǎn)品修改時(shí),
?
//工廠類也要做相應(yīng)的修改。如:如何創(chuàng)建及如何向客戶端提供。
//
//追MM少不了請(qǐng)吃飯了,麥當(dāng)勞的雞翅和肯德基的雞翅都是MM愛(ài)吃的東西,
//雖然口味有所不同,但不管你帶MM去麥當(dāng)勞或肯德基,
//只管向服務(wù)員說(shuō)“來(lái)四個(gè)雞翅”就行了。麥當(dāng)勞和肯德基就是生產(chǎn)雞翅的Factory。
?
//消費(fèi)者不固定,工廠者不固定,(工廠根據(jù)消費(fèi)者動(dòng)作)
?
//實(shí)現(xiàn)消費(fèi)者抽象基類,消費(fèi)者派生類的實(shí)現(xiàn),實(shí)例化就是消費(fèi)者
?
//操作的抽象基類,實(shí)現(xiàn)派生類各種操作,實(shí)例化的操作
?
//工廠的抽象類,抽象類包含了兩個(gè)抽象類的接口(消費(fèi)者,操作)
//抽象類實(shí)現(xiàn)了工廠類的抽象,實(shí)例化的派生類,實(shí)現(xiàn)工廠,
//根據(jù)用戶設(shè)置用戶,根據(jù)操作設(shè)置操作
?
class IUser
{
public:
??? //純虛接口類,抽象類
??? virtual void getUser() = 0;
??? virtual void setUser() = 0;
};
?
//繼承抽象實(shí)現(xiàn)sql數(shù)據(jù)庫(kù)使用者的實(shí)例化
class SqlUser :public IUser
{
public:
??? void getUser()
??? {
??????? cout << "在sql中返回user" << endl;
??? }
??? void setUser()
??? {
??????? cout << "在sql中設(shè)置user" << endl;
??? }
};
?
//繼承抽象實(shí)現(xiàn)access數(shù)據(jù)使用者的實(shí)例化
class AccessUser :public IUser
{
public:
??? void getUser()
??? {
??????? cout << "在Access中返回user" << endl;
??? }
??? void setUser()
??? {
??????? cout << "在Access中設(shè)置user" << endl;
??? }
};
?
//抽象類,提供接口
class IDepartment
{
public:
??? virtual void getDepartment() = 0;
??? virtual void setDepartment() = 0;
};
?
//SQL操作的實(shí)現(xiàn)
class SqlDepartment :public IDepartment
{
public:
??? void getDepartment()
??? {
??????? cout << "在sql中返回Department" << endl;
??? }
??? void setDepartment()
??? {
??????? cout << "在sql中設(shè)置Department" << endl;
??? }
};
?
//access操作的實(shí)現(xiàn)
class AccessDepartment :public IDepartment
{
public:
??? void getDepartment()
??? {
??????? cout << "在Access中返回Department" << endl;
??? }
??? void setDepartment()
??? {
??????? cout << "在Access中設(shè)置Department" << endl;
??? }
};
?
//抽象工廠
class IFactory
{
public:
??? virtual IUser *createUser() = 0;
??? virtual IDepartment *createDepartment() = 0;
};
?
//抽象工廠一個(gè)實(shí)現(xiàn)
class SqlFactory :public IFactory
{
public:
??? IUser *createUser()
??? {
??????? return new SqlUser();
??? }
??? IDepartment *createDepartment()
??? {
??????? return new SqlDepartment();
??? }
};
?
//抽象工廠一個(gè)實(shí)現(xiàn)
class AccessFactory :public IFactory
{
public:
??? IUser *createUser()
??? {
??????? return new AccessUser();
??? }
??? IDepartment *createDepartment()
??? {
??????? return new AccessDepartment();
??? }
};
?
//變相的實(shí)現(xiàn)了靜態(tài)類
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;//抽象消費(fèi)者
??? IDepartment *department;//提供的操作
?
??? factory = new AccessFactory();//基類的指針指指向派生類的對(duì)象
??? user = factory->createUser();//基類的指針指向派生類的對(duì)象
??? department = factory->createDepartment();//基類的指針指向派生類的對(duì)象
?
??? user->getUser();
??? user->setUser();//訪問(wèn)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;
}
運(yùn)行結(jié)果如下:
總結(jié)
- 上一篇: 2.策略模式
- 下一篇: 社保生育险报销条件 福利待遇及需满足条件