抽象工廠模式(C++實現)

(本博客旨在個人總結回顧)

1、詳情:

抽象工廠模式:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。

角色:

抽象工廠角色:這是抽象工廠模式的核心,它與應用程序無關。是具體工廠角色必須實現或繼承的的父類。

具體工廠角色:包含具體業務邏輯有關的代碼。由應用程序調用來創建對應的具體產品對象。它由具體的類來實現。

抽象產品角色:具體產品實現或繼承的父類。

具體產品角色:具體工廠角色所創建的對象爲此角色的實例。

優點:①便於交換產品系列;②讓具體的創建實例過程與客戶端分離。

缺點:新增產品族比較複雜,需要改變抽象工廠類,添加增產品類的對應具體工廠類,抽象產品類,具體產品類。

目的:客戶端提供一個統一接口,可以創建多個複雜產品族中的產品對象。

2、UML類圖:

 

3、代碼實現:

Mouse.h(抽象產品類1)

#pragma once
class Mouse
{
public:
    Mouse();
    virtual ~Mouse();

public:
    virtual void showProperty1() = 0;
};

Mouse.cpp

#include "stdafx.h"
#include "Mouse.h"

Mouse::Mouse()
{
}

Mouse::~Mouse()
{
}

DellMouse.h(具體產品1)

#pragma once
#include "Mouse.h"
class DellMouse :
    public Mouse
{
public:
    DellMouse();
    ~DellMouse();

public:
    void showProperty1();
};

DellMouse.cpp

#include "stdafx.h"
#include "DellMouse.h"

DellMouse::DellMouse()
{
}

DellMouse::~DellMouse()
{
}

void DellMouse::showProperty1()
{
    cout << "This is the Dell Mouse" << endl;
}

HPMouse.h(具體產品2)

#pragma once
#include "Mouse.h"
class HPMouse :
    public Mouse
{
public:
    HPMouse();
    ~HPMouse();

public:
    void showProperty1();
};

HPMouse.cpp

#include "stdafx.h"
#include "HPMouse.h"

HPMouse::HPMouse()
{
}

HPMouse::~HPMouse()
{
}

void HPMouse::showProperty1()
{
    cout << "This is HP Mouse!" << endl;
}

Keyboard.h(抽象產品2)

#pragma once
class Keyboard
{
public:
    Keyboard();
    virtual ~Keyboard();
public:
    virtual void showProperty2()=0;
};

Keyboard.cpp

#include "stdafx.h"
#include "Keyboard.h"

Keyboard::Keyboard()
{
}

Keyboard::~Keyboard()
{
}

DellKeyboard.h(具體產品1)

#pragma once
#include "Keyboard.h"
class DellKeyboard :
    public Keyboard
{
public:
    DellKeyboard();
    ~DellKeyboard();

public:
    void showProperty2();
};

DellKeyboard.cpp

#include "stdafx.h"
#include "DellKeyboard.h"

DellKeyboard::DellKeyboard()
{
}

DellKeyboard::~DellKeyboard()
{
}

void DellKeyboard::showProperty2()
{
    cout << "This is Dell Keyboard!" << endl;
}

HPKeyboard.h(具體產品2)

#pragma once
#include "Keyboard.h"
class HPKeyboard :
    public Keyboard
{
public:
    HPKeyboard();
    ~HPKeyboard();

public:
    void showProperty2();
};

HPKeyboard.cpp

#include "stdafx.h"
#include "HPKeyboard.h"

HPKeyboard::HPKeyboard()
{
}

HPKeyboard::~HPKeyboard()
{
}

void HPKeyboard::showProperty2()
{
    cout << "This is HP Keyboard!" << endl;
}

AbstractFactory.h(抽象工廠類)

#pragma once
#include "Mouse.h"
#include "Keyboard.h"

class AbstractFactory
{
public:
    AbstractFactory();
    ~AbstractFactory();

public:
    virtual Mouse* getMouse(ProductType eProductType) = 0;
    virtual Keyboard* getKeyboard(ProductType eProductType) = 0;
};

AbstractFactory.cpp

#include "stdafx.h"
#include "AbstractFactory.h"

AbstractFactory::AbstractFactory()
{
}

AbstractFactory::~AbstractFactory()
{
}

MouseFactory.h(具體工廠類1)

#pragma once
#include "AbstractFactory.h"
class MouseFactory :
    public AbstractFactory
{
public:
    MouseFactory();
    virtual ~MouseFactory();

public:
    Mouse* getMouse(ProductType eProductType);
    Keyboard* getKeyboard(ProductType eProductType);
};

MouseFactory.cpp

#include "stdafx.h"
#include "MouseFactory.h"
#include "DellMouse.h"
#include "HPMouse.h"

MouseFactory::MouseFactory()
{
}

MouseFactory::~MouseFactory()
{
}

Mouse* MouseFactory::getMouse(ProductType eProductType)
{
    switch (eProductType)
    {
    case PT_DELL:
        return new DellMouse();
        break;
    case PT_HP:
        return new HPMouse();
        break;
    default:
        return NULL;
        break;
    }
}

Keyboard* MouseFactory::getKeyboard(ProductType eProductType)
{
    return NULL;
}

KeyboardFactory.h(具體工廠類2)

#pragma once
#include "AbstractFactory.h"

class KeyboardFactory :
    public AbstractFactory
{
public:
    KeyboardFactory();
    ~KeyboardFactory();

public:
    Mouse* getMouse(ProductType eProductType);
    Keyboard* getKeyboard(ProductType eProductType);
};

KeyboardFactory.cpp

#include "stdafx.h"
#include "KeyboardFactory.h"
#include "DellKeyboard.h"
#include "HPKeyboard.h"

KeyboardFactory::KeyboardFactory()
{
}

KeyboardFactory::~KeyboardFactory()
{
}

Mouse* KeyboardFactory::getMouse(ProductType eProductType)
{
    return NULL;
}

Keyboard* KeyboardFactory::getKeyboard(ProductType eProductType)
{
    switch (eProductType)
    {
    case PT_DELL:
        return new DellKeyboard();
        break;
    case PT_HP:
        return new HPKeyboard();
        break;
    default:
        break;
        return NULL;
    }
}

stdafx.h(預編譯頭)

// stdafx.h : 標準系統包含文件的包含文件,
// 或是經常使用但不常更改的
// 特定於項目的包含文件
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>

#include <iostream>
using namespace std;
enum ProductType{ PT_DELL, PT_HP };

// TODO:  在此處引用程序需要的其他頭文件

調用代碼:

// AbstractFactoryPatternMemo.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include "AbstractFactory.h"
#include "MouseFactory.h"
#include "KeyboardFactory.h"
#include "Mouse.h"
#include "Keyboard.h"
#include "FactoryProducer.h"


int _tmain(int argc, _TCHAR* argv[])
{
    AbstractFactory* pAbstractFactory = new MouseFactory();
    Mouse* pMouse = pAbstractFactory->getMouse(PT_DELL);
    pMouse->showProperty1();

    pMouse = pAbstractFactory->getMouse(PT_HP);
    pMouse->showProperty1();

    pAbstractFactory = new KeyboardFactory();
    Keyboard* pKeyboard = pAbstractFactory->getKeyboard(PT_DELL);
    pKeyboard->showProperty2();

    pKeyboard = pAbstractFactory->getKeyboard(PT_HP);
    pKeyboard->showProperty2();

    system("pause");
	return 0;
}

輸出結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章