1. 程式人生 > >【設計模式】簡單工廠模式

【設計模式】簡單工廠模式

jsb 工廠模式 tle virt -m 虛函數 ios efault def

以面向對象的思想和簡單工廠模式。寫一個C++計算器程序,代碼例如以下:

#include <iostream>
using namespace std;
class Operation {
public:
    Operation(double left, double right)
    {
        lhs = left;
        rhs = right;
    }
    const double GetLeft() const
    {
        return lhs;
    }
    const double GetRight() const
    {
        return rhs;
    }
    void SetLeft(const double left)
    {
        lhs = left;
    }
    void SetRight(const double right)
    {
        rhs = right;
    }
    virtual double Calculate() = 0; // 純虛函數
protected:
    double lhs;
    double rhs;
};
class Add : public Operation {
public:
    Add(double left, double right) : Operation(left, right)
    {}
    double Calculate()
    {
        return lhs + rhs;
    }
};
class Sub : public Operation {
public:
    Sub(double left, double right) : Operation(left, right)
    {}
    double Calculate()
    {
        return lhs - rhs;
    }
};
class Mul : public Operation {
public:
    Mul(double left, double right) : Operation(left, right)
    {}
    double Calculate()
    {
        return lhs * rhs;
    }
};
class Div : public Operation {
public:
    Div(double left, double right) : Operation(left, right)
    {
        try
        {
            if (right == 0)
                throw runtime_error("The divisor cannot be 0\n");
            
        }
        catch (const runtime_error &e)
        {
            cout << e.what() << endl;
            throw;
        }
    }
    double Calculate()
    {
        return lhs / rhs;
    }
};
// 工廠函數
Operation* FactoryFunction(double left, double right, char op)
{
    switch (op)
    {
    case '+':
        return new Add(left, right);
        break;
    case '-':
        return new Sub(left, right);
        break;
    case '*':
        return new Mul(left, right);
        break;
    case '/':
        return new Div(left, right);
        break;
    default:
        throw runtime_error("Operation invalid!");
        break;
    }
}
int main()
{
    Operation *add = FactoryFunction(11, 22, '+');
    Operation *sub = FactoryFunction(25, 32, '-');
    Operation *mul = FactoryFunction(11, 11, '*');
    Operation *div = FactoryFunction(50, 8, '/');
    cout << add->GetLeft() << " + " << add->GetRight() << " = " << add->Calculate() << endl;
    cout << sub->GetLeft() << " - " << sub->GetRight() << " = " << sub->Calculate() << endl;
    cout << mul->GetLeft() << " * " << mul->GetRight() << " = " << mul->Calculate() << endl;
    cout << div->GetLeft() << " / " << div->GetRight() << " = " << div->Calculate() << endl;

    div->SetLeft(40);
    cout << div->GetLeft() << " / " << div->GetRight() << " = " << div->Calculate() << endl;

    // 別忘記銷毀指針
    delete add;
    delete sub;
    delete mul;
    delete div;
    system("pause");
    return 0;
} 


執行結果: 技術分享

基類Operation將運算的兩個操作數進行封裝。使用戶無法直接訪問操作數。

如果用戶要訪問或改動操作數,在基類中加入函數接口就可以。同一時候運用繼承,將詳細的操作符從基類派生出來。並依據運算符特性重寫基類中的純虛函數。這樣做的優點是可以減少耦合度。如果須要向代碼中加入新的運算符。那麽僅僅須要將新的運算符繼承自Operation基類就可以。不須要改動其他派生類中的代碼。本例使用一個工廠函數FactoryFunction來實例化對象。該工廠函數返回一個基類指針,指向派生類對象,使得用戶可以調用同樣的函數生成不同的對象。然後依據多態性質調用派生類的Calculate虛函數。UML圖例如以下: 技術分享

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmVzdGxlcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

參考: 《大話設計模式》第1章。

【設計模式】簡單工廠模式