设计模式——简单工厂

以简单工厂类为接口,工厂类根据不同输入参数创建具体的对象,实现界面和业务的解耦(界面需求改变和业务需求改变不互相影响)
对业务进行封装,利用继承使程序容易扩展,利用多态,用工厂类来实现对象实例的创建维护
工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

工厂模式的使用场景:

  • 当我们无法预知对象确切类别以及其依赖关系时(创建产品代码与使用产品代码分离,便于扩展;当要增加新产品时,只需要开发新的创建者子类,然后重写工厂方法即可)
  • 希望用户能扩展你软件库或框架的内部组件
  • 希望复用现有对象来节省系统资源, 而不是每次都重新创建对象
    请添加图片描述
#include <iostream>
#include <string>

using namespace std;

// 简单工厂模式
// 实现一个计算器
// 定义一个运算基类,用于管理两个运算数
// 定义加减乘除运算类,后续添加开根号之类的操作只需要添加相应的类,并且在工厂类中添加相应的分支即可
// 工厂类,选择实例化哪一个



// 运算基类
class Operation
{
public:
    void setNumberA(double const num)
    {
        numberA = num;
    }
    void setNumberB(double const num)
    {
        numberB = num;
    }

    virtual double GetResult() = 0;

protected:
    double numberA;
    double numberB;
};

// 加法类
class OperationAdd : public Operation
{
public:
    virtual double GetResult()
    {
        return numberA + numberB;
    }
};

// 减法类
class OperationSub : public Operation
{
public:
    virtual double GetResult()
    {
        return numberA - numberB;
    }
};

// 乘法类
class OperationMul : public Operation
{
public:
    virtual double GetResult()
    {
        return numberA * numberB;
    }
};

// 除法类
class OperationDiv : public Operation
{
public:
    virtual double GetResult()
    {
        return numberA / numberB;
    }
};

// 工厂类
class OperatorFactory
{
public:
    static Operation *CreateOperation(char ope)
    {
        Operation *operation = nullptr;
        switch (ope)
        {
        case '+':
            operation = new OperationAdd();
            break;
        case '-':
            operation = new OperationSub();
            break;
        case '*':
            operation = new OperationMul();
            break;
        case '/':
            operation = new OperationDiv();
            break;
        default:
            operation = nullptr;
        }

        return operation;
    }
};

int main()
{
    Operation *operation = nullptr; // 静态绑定的是Operation基类,但是动态绑定的是OperationSub这样的运算类
    float num1, num2, result;
    char ope;
    while (1)
    {

        do
        {
            if (cin.fail())
            {
                cin.clear(); // 清除错误标志
                cout << "输入错误, 请重新输入" << endl;
            }
            else
            {
                cout << "请输入第一个参数" << endl;
            }

            cin >> num1;
            cin.sync(); // 清除缓存
        } while (cin.fail());

        do
        {
            if (cin.fail())
            {
                cin.clear();
                cout << "输入错误,请重新输入" << endl;
            }
            else
            {
                cout << "请输入第二个参数:" << endl;
            }
            cin >> num2;
            cin.sync();
        } while (cin.fail());

        cout << "输入运算符(+, -, *, /):" << endl;
        cin >> ope;
        cin.sync();

        operation = OperatorFactory::CreateOperation(ope);

        if (operation != nullptr)
        {
            operation->setNumberA(num1); // 派生类指针调用父类方法,
            operation->setNumberB(num2);
            result = operation->GetResult();
            cout << "计算结果: " << result << endl;
            delete operation;
            operation = nullptr; // 防止野指针
        }
        else
        {
            cout << "计算结果:" << "error" << endl;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值