舉個例子吧,就拿鍵盤和鼠標(biāo)來說吧,鍵盤和鼠標(biāo)就是一些列的類。而鍵盤鼠標(biāo)又有微軟的和聯(lián)想的區(qū)別。所有有了微軟的工廠和聯(lián)想的工廠。鍵盤和鼠標(biāo)具體的創(chuàng)建由工廠來負(fù)責(zé),而具體創(chuàng)建微軟的還是聯(lián)想的則由客戶端來指定,而客戶端根本不用知道鼠標(biāo)和鍵盤這些類。此例的示例代碼如下:
// AbstractFactoryModel.h文件
#pragma once
#include <iostream>
// 鍵盤
class KeyBoard
{
public:
virtual void show() = 0;
};
// 微軟的鍵盤
class KeyBoardMicro : public KeyBoard
{
public:
void show()
{
std::cout << "微軟的鍵盤" << std::endl;
}
};
// 聯(lián)想的鍵盤
class KeyBoardLenovo : public KeyBoard
{
public:
void show()
{
std::cout << "聯(lián)想的鍵盤" << std::endl;
}
};
// 鼠標(biāo)
class Mouse
{
public:
virtual void show() = 0;
};
class MouseMicro : public Mouse
{
public:
void show()
{
std::cout << "微軟的鼠標(biāo)" << std::endl;
}
};
class MouseLenovo : public Mouse
{
public:
void show()
{
std::cout << "聯(lián)想的鼠標(biāo)" << std::endl;
}
};
// 工廠
class Factory
{
public:
virtual KeyBoard * createKeyBoard() = 0;
virtual Mouse * createMouse() = 0;
};
// 微軟的工廠
class FactoryMicro : public Factory
{
public:
KeyBoard * createKeyBoard()
{
return new KeyBoardMicro();
}
Mouse * createMouse()
{
return new MouseMicro();
}
};
// 聯(lián)想的工廠
class FactoryLenovo : public Factory
{
public:
KeyBoard * createKeyBoard()
{
return new KeyBoardLenovo();
}
Mouse * createMouse()
{
return new MouseLenovo();
}
};
測試代碼如下:
#include <iostream>
#include "AbstractFactoryModel.h"
int main()
{
using namespace std;
// 抽象工廠模式
Factory * p = new FactoryMicro();
KeyBoard * pKeyBoard = p->createKeyBoard();
Mouse * pMouse = p->createMouse();
pKeyBoard->show();
pMouse->show();
delete pMouse;
delete pKeyBoard;
delete p;
p = new FactoryLenovo();
pKeyBoard = p->createKeyBoard();
pMouse = p->createMouse();
pKeyBoard->show();
pMouse->show();
delete pMouse;
delete pKeyBoard;
delete p;
getchar();
return 0;
}
抽象工廠模式和工廠方法模式很相似。最大的區(qū)別就是抽象工廠模式不止一個產(chǎn)品簇,并且每個工廠都不止生產(chǎn)一種產(chǎn)品。比如在工廠方法模式中,不同的工廠可以生產(chǎn)不同的產(chǎn)品。比如鍵盤、鼠標(biāo)。分別由鍵盤工廠和鼠標(biāo)工廠,但是智能生產(chǎn)一種鍵盤和鼠標(biāo)。但是在抽象工廠模式中,每個工廠可以生產(chǎn)鍵盤和鼠標(biāo)。還可以生產(chǎn)不同牌子的鍵盤和鼠標(biāo)。說到這里,其實(shí)抽象工廠模式可以和簡單工廠模式結(jié)合起來,來創(chuàng)建不同的工廠。
抽象工廠模式最大的好處便是易于交換產(chǎn)品系列,只要改變創(chuàng)建的工廠對象就可以實(shí)現(xiàn)產(chǎn)品系列的更換。還有一個優(yōu)點(diǎn)是它讓具體的創(chuàng)建實(shí)例的過程于客戶端分離,客戶端是通過它們抽象接口操縱實(shí)例,產(chǎn)品的具體類名也被具體工廠的實(shí)現(xiàn)分離,不會出現(xiàn)在客戶代碼中。最大的缺點(diǎn)是如果像添加產(chǎn)品則非常麻煩需要修改很多類。
參考:https://blog.csdn.net/konglongdanfo1/java/article/details/83380770