简单工厂模式,主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。优点:适用于不同情况创建不同的类时。缺点:客户端必须要知道基类和工厂类,耦合性差。需要根据不同的需求创建不同的类。添加类的时候需要更爱工厂类。 以四则运算为例,其UML图如下:
在客户端中给简单工厂类传递相关参数,工厂根据参数判断要create什么类型的对象,然后返回该对象。示例代码如下:
// SimpleFactoryModel.h文件 #pragma once // 操作基类 template<typename T> class COperator { public: virtual T getResult() = 0; virtual void setArgs(T lpa, T rpa); protected: T lah, rah; }; template<typename T> void COperator<T>::setArgs(T lpa, T rpa) { lah = lpa; rah = rpa; } // 加法类 template<typename T> class CAddOperator : public COperator<T> { public: virtual T getResult() { return COperator<T>::lah + COperator<T>::rah; } }; // 减法类 template<typename T> class CSubOperator : public COperator<T> { public: virtual T getResult() { return COperator<T>::lah - COperator<T>::rah; } }; // 乘法类 template<typename T> class CMulOperator : public COperator<T> { public: virtual T getResult() { return COperator<T>::lah * COperator<T>::rah; } }; // 除法类 template<typename T> class CDivOperator : public COperator<T> { public: virtual T getResult() { if (0 == COperator<T>::rah) { std::cout << "除数不能为0" << std::endl; return 0; } return COperator<T>::lah / COperator<T>::rah; } }; // 工厂类 template<typename T> class CCalculatorFactory { public: static COperator<T> * createObject(char c); }; template<typename T> COperator<T> * CCalculatorFactory<T>::createObject(char c) { COperator<T> * oper; switch (c) { case '+': oper = new CAddOperator<T>(); break; case '-': oper = new CSubOperator<T>(); break; case '*': oper = new CMulOperator<T>(); break; case '/': oper = new CDivOperator<T>(); break; default: oper = new CAddOperator<T>(); break; } return oper; }测试代码如下:
#include <iostream> #include "SimpleFactoryModel.h" int main() { using namespace std; // 创建对象 COperator<double> *p = CCalculatorFactory<double>::createObject('/'); p->setArgs(23.23, 10.74); cout << p->getResult() << endl; delete p; p = CCalculatorFactory<double>::createObject('+'); p->setArgs(23.23, 10.74); cout << p->getResult() << endl; delete p; p = CCalculatorFactory<double>::createObject('-'); p->setArgs(23.23, 10.74); cout << p->getResult() << endl; delete p; p = CCalculatorFactory<double>::createObject('*'); p->setArgs(23.23, 10.74); cout << p->getResult() << endl; delete p; getchar(); return 0; getchar(); return 0; }测试输出如下:
简单工厂模式破坏了开放-封闭原则,当想添对象类型的时候,例如上例中想添加一个‘^’的运算,则需要添加一个乘方类并且需要修改简单工厂类。这是简单工工厂模式的一个缺点,因为我们最好遵循只添加不修改的原则,即开放-封闭原则。