1. 程式人生 > >C++設計模式 ==> 工廠模式

C++設計模式 ==> 工廠模式

簡介

在之前,筆者曾簡單介紹過簡單工廠模式,我們說過簡單工廠模式可以使用工廠類根據需求動態生成子類物件,從而方便了未來對演算法進行維護和擴充套件。而工廠模式相較之於簡單工廠模式更為複雜,工廠模式對工廠類進行了詳細的子類化,為每一個演算法都建立了獨立的工廠,這樣的優點在於可以在演算法擴充套件的時候避免修改總工廠類,而只要生成相應的子類就可以了,儘可能避免了違背“開閉原則”的情況,但缺點在於這樣switch一類的條件判斷就必須從原來的工廠類搬到了客戶端。下面我們通過一個和當時在簡單工廠模式章節一樣的計算器演算法的例子實現一下工廠模式。

圖示

工廠模式圖示

程式碼實現

////////////////////////////
//
//  @Author : PeterZheng
// @FileName : FactoryModeDefine.h // @Date : 2018-08-13 19:17 // //////////////////////////// #pragma once #ifndef FMDINCLUDE #define FMDINCLUDE #include <iostream> #include <cstdio> #include <cstdlib> #include <string> #include <windows.h> #endif //運算子操作類 class Operation { public: double _numberA = 0
; double _numberB = 0; double result = 0; virtual double GetResult() { return 0.0; }; }; //總工廠類 class IFactory { public: virtual Operation* CreateFactory() = 0; }; //加法操作類 class AddOperation : public Operation { virtual double GetResult() { return _numberA + _numberB; } }; //減法操作類
class SubOperation : public Operation { virtual double GetResult() { return _numberA - _numberB; } }; //乘法操作類 class MulOperation : public Operation { virtual double GetResult() { return _numberA * _numberB; } }; //除法操作類 class DivOperation : public Operation { virtual double GetResult() { if (_numberB != 0) return _numberA / _numberB; else ExitProcess(0); } }; //加法工廠類 class AddOpFactory : public IFactory { virtual Operation* CreateFactory() { return new AddOperation(); } }; //減法工廠類 class SubOpFactory : public IFactory { virtual Operation* CreateFactory() { return new SubOperation(); } }; //乘法工廠類 class MulOpFactory : public IFactory { virtual Operation* CreateFactory() { return new MulOperation(); } }; //除法工廠類 class DivOpFactory : public IFactory { virtual Operation* CreateFactory() { return new DivOperation(); } };
////////////////////////////
//
//  @Author : PeterZheng
//  @FileName : FMDemo.cpp
//  @Date : 2018-08-13 19:50
//
////////////////////////////

#include "FactoryModeDefine.h"

int main(void)
{
    double _numberA = 0;
    double _numberB = 0;
    char symbol = '\0';
    Operation *op = NULL;
    IFactory *ft = NULL;
    scanf("%lf %c %lf", &_numberA, &symbol, &_numberB);
    switch (symbol)
    {
    case '+':
        ft = new AddOpFactory();
        break;
    case '-':
        ft = new SubOpFactory();
        break;
    case '*':
        ft = new MulOpFactory();
        break;
    case '/':
        ft = new DivOpFactory();
        break;
    default:
        ExitProcess(0);
    }
    op = ft->CreateFactory();
    op->_numberA = _numberA;
    op->_numberB = _numberB;
    op->result = op->GetResult();
    std::cout << op->result << std::endl;
    system("pause");
    return 0;
}