設計模式 -- 簡單工廠模式 SimpleFactory

引入:

類的創建型模式,一個工廠對象決定應該創建哪一種產品類的實例,這樣外界就不用直接創建對象而只要消費對象就可以了,也不必知道這些對象是如何創建如何組織的,這樣就明確了各自的職責和權利。有利於軟件體系結構的優化和重構。


角色以及指責:

  • 工廠Factory:模式的核心,負責創建各所有實例的內部邏輯,可以被外界調用,創建所需要的產品對象。

  • 抽象產品角色AbstractProduct:工廠所創建的產品對象的父類,提供統一的公共訪問接口。

  • 具體產品角色ConcreteProduct:創建的目標,每個對象都是充當這個角色的具體實例


缺點:

由於工廠類集中了所有實例的創建,違反了高內聚的責任分配原則,如果要添加新的類就需要改變工廠。

當具體產品類增多的適合,工廠可能會根據各種不同的要求來創建實例,可能出現各種條件判斷創建交織一起,很難避免模塊功能的蔓延,不利於系統的維護和擴展。但是在工廠方法模式中得到一定的克服。


使用場景:

  • Factoty負責創建的實例比較少

  • 客戶只知道傳入工廠的參數,對如何創建的邏輯不關心

  • 一般很少情況下使用,因爲違反高內聚的原則

Example:計算器

//  簡單工廠模式  實例:計算器
#include <iostream>
#include <cstdlib>
using namespace std;
 
//抽象產品類 -- 運算
class Operation
{
public:
    virtual double getResult()
    {
        double result = 0;
        return result;
    }
 
    double getNumA() const {
        return numA;
    }
 
    void setNumA(double numA) {
        this->numA = numA;
    }
 
    double getNumB() const {
        return numB;
    }
 
    void setNumB(double numB) {
        this->numB = numB;
    }
 
private:
    double numA;
    double numB;
};
 
//產品類  加法
class OperationAdd : public Operation
{
public:
    double getResult()
    {
        double result = 0;
        result = getNumA() + getNumB();
        return result;
    }
};
 
//產品類  減法
class OperationSub : public Operation
{
public:
    double getResult()
    {
        double result = 0;
        result = getNumA() - getNumB();
        return result;
    }
};
 
//產品類  乘法
class OperationMul : public Operation
{
public:
    double getResult()
    {
        double result = 0;
        result = getNumA() * getNumB();
        return result;
    }
};
 
//產品類  除法
class OperationDiv : public Operation
{
public:
    double getResult()
    {
        double result = 0;
        if(getNumB() == 0)
        {
            std::cout << "除數不能爲0" << std::endl;
            exit(1);
        }
        result = getNumA() / getNumB();
        return result;
    }
};
 
//新增了運算Pow,A的B次方,只需要增加class OperationPow以及修改Factory即可
class OperationPow : public Operation
{
public:
    double getResult()
    {
        double result = 1;
        for(int i= 0; i<getNumB(); i++)
        {
            result = result * getNumA();
        }
        return result;
    }
};
 
//工廠類,負責創建產品
class OperationFactory
{
public:
    static Operation* createOperation(char opr)
    {
        Operation *pOpr;
        switch(opr)
        {
            case '+':
                pOpr = new OperationAdd();
                break;
            case '-':
                pOpr = new OperationSub();
                break;
            case '*':
                pOpr = new OperationMul();
                break;
            case '/':
                pOpr = new OperationDiv();
                break;
            case 'p':
                pOpr = new OperationPow();
                break;
        }
        return pOpr;
    }
 
};
 
int main() {
    Operation *p;
    p = OperationFactory::createOperation('p');
    p->setNumA(5);
    p->setNumB(3);
    double re = p->getResult();  //125
    std::cout << re << std::endl;
    return 0;
}

小小的計算器完啦!怎樣,簡單吧。。。

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