简单工厂模式

来源:互联网 发布:淘宝手机端详情页gif 编辑:程序博客网 时间:2024/06/05 10:20

简单工厂模式

UML类图:



简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。

简单工厂模式角色:

● Factory(工厂角色):工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它的返回类型为抽象产品类型Product。
● Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。
● ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。
在简单工厂模式中,客户端通过工厂类来创建一个产品类的实例,而无须直接使用new关键字来创建对象,它是工厂模式家族中最简单的一员。


简单工厂模式优缺点:

优点:

(1)将客户端的逻辑判断移至工厂中,减轻客户端压力,客户端直接调用create方法即可。

(2)客户端不用频繁的new xxx,由于产品有共同基类,所以可以根据参数返回不同子类对象


缺点:

(1) 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

(2) 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。


 适用场景

 (1) 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。

 (2) 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。




<span style="font-size:18px;">#pragma once#ifndef OPERATION_HEADER#define OPERATION_HEADER#include<assert.h>typedef enum _OP_TYPE{ADD = 0, SUB, MUL, DIV}OP;template<class T>class Operation{public:T m_Num1;T m_Num2;public:virtual T GetResult()const = 0;//纯虚函数 抽象类protected://派生类继承后可重写(覆盖)T GetNum1()const{return m_Num1;}T GetNum2()const{return m_Num2;}void SetNum1(const T& num){m_Num1 = num;}void SetNum2(const T& num){m_Num2 = num;}};//加法类template<class T>class OperationAdd :public Operation<T>{public:OperationAdd(T Num1, T Num2){m_Num1 = Num1;m_Num2 = Num2;}virtual T GetResult()const{return m_Num1 + m_Num2;}};//减法类template<class T>class OperationSub :public Operation<T>{public:OperationSub(T Num1, T Num2){m_Num1 = Num1;m_Num2 = Num2;}virtual T GetResult()const{return m_Num1 - m_Num2;}};//乘法类template<class T>class OperationMul :public Operation<T>{public:OperationMul(T Num1, T Num2){m_Num1 = Num1;m_Num2 = Num2;}virtual T GetResult()const{return m_Num1 * m_Num2;}};//除法类template<class T>class OperationDiv :public Operation<T>{public:OperationDiv(T Num1, T Num2){m_Num1 = Num1;m_Num2 = Num2;}virtual T GetResult()const{//assert(0 != m_Num2);return m_Num1 / m_Num2;}};#endif</span>

<span style="font-size:18px;">#pragma once#ifndef SIMPLE_FACTORY_HEADER#define SIMPLE_FACTORY_HEADER#include"Operation.h"template<class T=double>class OperationFactory{public:static Operation<T>* CreatOperation(OP type,T Num1,T Num2){Operation<T>* oper=nullptr;switch (type){case ADD:oper = new OperationAdd<T>(Num1, Num2);break;case SUB:oper = new OperationSub<T>(Num1, Num2);break;case MUL:oper = new OperationMul<T>(Num1, Num2);break;case DIV:oper = new OperationDiv<T>(Num1, Num2);break;default:break;}assert(nullptr!=oper);return oper;}};#endif</span>

<span style="font-size:18px;">#include<iostream>#include"SimpleFactory.h"using namespace std;int main(void){Operation<double> *oper=OperationFactory<double>::CreatOperation(ADD,25,13.0);cout<<oper->GetResult()<<endl;oper = OperationFactory<double>::CreatOperation(DIV, 24, 12.0);cout << oper->GetResult() << endl;return 0;}</span>


0 0