1. 程式人生 > >大話設計模式第1章——簡單工廠模式

大話設計模式第1章——簡單工廠模式

簡單工廠模式是屬於建立型模式,又叫做靜態工廠方法(Static Factory Method)模式,實質是由一個工廠類根據傳入的引數,動態決定應該建立哪一個產品類(這些產品類繼承自一個父類或介面)的例項。

該模式中包含三個角色:

工廠(Factory)角色

簡單工廠模式的核心,它負責實現建立所有例項的內部邏輯。工廠類的建立產品類的方法可以被外界直接呼叫,建立所需的產品物件。

抽象產品(Product)角色

簡單工廠模式所建立的所有物件的父類,它負責描述所有例項所共有的公共介面。

具體產品(Concrete Product)角色

是簡單工廠模式的建立目標,所有建立的物件都是充當這個角色的某個具體類的例項。

優點:外界不需要知道具體物件如何建立和組織,明確了各自的職責;

缺點:違反了高內聚的原則,將全部建立邏輯集中到了一個工廠類中;它所能建立的類只能是事先考慮到的,如果需要新增新的類,則就需要改變工廠類了。

UML類圖:

C++實現:

#include <iostream>

using namespace std;
//演算法抽象類
class OPeration
{
public:
    double GetA()
    {
        return m_dA;
    }

    double GetB()
    {
        return m_dB;
    }

    virtual double GetResult()
    {
        double dResult = 0;
        return dResult;
    }

    void SetA(double dA)
    {
        m_dA = dA;
    }

    void SetB(double dB)
    {
        m_dB = dB;
    }

protected:
    double m_dA;
    double m_dB;
};

class OperationAdd:public OPeration
{
public:
    double GetResult()
    {
        double dResult = m_dA + m_dB;
        return dResult;
    }
};

class OperationSub:public OPeration
{
public:
    double GetResult()
    {
        double dResult = m_dA - m_dB;
        return dResult;
    }
};

class OperationMult:public OPeration
{
public:
    double GetResult()
    {
        double dResult = m_dA * m_dB;
        return dResult;
    }
};

class OperationDivi:public OPeration
{
public:
    double GetResult()
    {
        if(0 == m_dA)
        {
            return 0;
        }
        double dResult = m_dA / m_dB;
        return dResult;
    }
};
//工廠類
class OPerationFactory
{
public:
    OPeration *CreateOperation(char type)
    {
        OPeration *oper = NULL;
        switch(type)
        {
        case '+':
            oper = new OperationAdd;
            break;
        case '-':
            oper = new OperationSub;
            break;
        case '*':
            oper = new OperationMult;
            break;
        case '/':
            oper = new OperationDivi;
            break;
        }
        return oper;
    }
};

int main()
{
    OPerationFactory factory;
    OPeration *oper = factory.CreateOperation('*');
    oper->SetA(123);
    oper->SetB(321);

    cout << oper->GetResult() << endl;

    if(oper != NULL)
    {
        delete oper;
        oper = NULL;
    }
    return 0;
}