简单工厂模式
来源:互联网 发布:淘宝手机端详情页gif 编辑:程序博客网 时间:2024/06/05 10:20
简单工厂模式
● 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>
- 工厂模式-简单工厂
- 工厂模式-简单工厂
- 工厂模式-简单工厂模式
- 工厂模式-简单工厂模式
- 简单工厂模式,工厂模式
- 工厂模式-简单工厂模式
- 简单工厂模式,工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂&工厂模式&抽象工厂模式
- 简单工厂和工厂模式
- 简单工厂和工厂模式
- 1,工厂模式--简单工厂
- 简单工厂和工厂模式
- 简单工厂,工厂模式,抽象工厂
- 简单工厂,工厂模式,抽象工厂
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂模式和抽象工厂
- php加密方法
- android自定义UI组件
- Intellij IDEA常用配置详解
- C++实验2—作业
- IP地址,子网掩码,默认网关,DNS服务器详解
- 简单工厂模式
- LintCode 删除链表中倒数第n个节点
- 使用Collections.sort()实现List正反排序的方法
- JavaScript 基础知识点
- IP地址和子网掩码的算法
- Httpie 工具入门使用
- Activity之Notification(通知)
- 新框架(BSF_JAVA)环境部署个人总结
- 如何对singleInstance的Activity多次传入Intent