抽象工廠模式

舉個例子吧,就拿鍵盤和鼠標(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容