设计模式学习——简单工厂模式

What:

工厂模式属于创建型的设计模式,创建型的
设计模式隐藏了实例化对象的的创建逻辑,
不是直接使用new来实例化对象,更加灵活
在程序中针对某个给定实例需要创建哪些对象更加灵活

Why:

主要是解决接口选择问题

When:

计划在不同条件下实例化不同的对象

How:

实现一个工厂类,通过工厂类返回不同的子类(产品类)

Where:

一些使用场景

 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器
 2、数据库访问,最终还没决定使用何种数据库,这是可以变化的
 3、设计一个连接服务器的框架,需要三种不同协议,
      在不同情况下使用的协议不一样

优点:

1、实例化一个对象,只需要知道名称即可
2、扩展性高,增加一个产品只需要增一个加产品类和工厂类

缺点 :

优点也就是缺点的原因,每增加一个产品就要实现具体类和工厂,系统复杂度会增加

简单计算器的工厂模式实现

1、实现运算类

class operate
{
    
    
public :
    double num1;
    double num2;
    virtual double get_result(double num1, double num2) = 0; //纯虚函数
};

2、实现加法类

//加法类
class add : public operate   //继承运算类
{
    
    
public :
    double get_result(double num1, double num2);
};

double add :: get_result(double num1, double num2)
{
    
    
    return (num1 + num2);
}

其他减法、乘法、除法类都是类似的实现

实现运算工厂类

class operate_fac   //工厂类
{
    
    
public:
    operate *get_operate(char c);
};

operate * operate_fac::get_operate(char c)
{
    
    
    operate *opr;
    switch(c)
    {
    
    
    case '+':
        opr =  new add();
        break;
    case '-':
        opr =  new sub();
        break;
    case '*':
        opr =  new mul();
        break;
    case '/' :
        opr =  new div();
        break;
    }
    return opr;
}

运用工厂模式

#include <iostream>
#include "add.h"
#include "sub.h"
#include "div.h"
#include "mul.h"
#include "operate_factory.h"

using namespace std;

int main()
{
    
    
    operate_fac operate_f;  //创建工厂类
    operate *add_opr = operate_f.get_operate('+'); //通过工厂类实例化对象,实例化的是加法运算类
    add_opr->num1 = 2;
    add_opr->num2 = 10;
    cout << add_opr->get_result(add_opr->num1, add_opr->num2) << endl;  //调用的加法的运算类的运算方法

    operate *sub_opr = operate_f.get_operate('-'); //实例化的是减法运算类
    sub_opr->num1 = 10;
    sub_opr->num2 = 5;
    cout << sub_opr->get_result(sub_opr->num1, sub_opr->num2) << endl;

    delete add_opr;
    delete sub_opr;

    return 0;
}


学习参考:
1、《大话设计模式》
2、《设计模式——可复用面向对象软件的基础》

猜你喜欢

转载自blog.csdn.net/qq_36413982/article/details/107531944