0
点赞
收藏
分享

微信扫一扫

【设计模式1】简单工厂模式


要点总括

(1)代码规范性:命名规范、逻辑强(无明显Bug)、无冗余判断(eg:多个并列if用else if或switch case替代);
(2)面向对象:易维护、可复用、可扩展、灵活性好
(3)面向对象三大特性:封装、继承、多态,合理使用将显著降低程序的耦合度;
(4)封装:业务逻辑(eg:计算器的计算功能)和界面逻辑(eg:计算器的显示)分开,从而降低耦合度,提升复用性;
(5)松散耦合:基于继承多态,采用不同的类单独实现各模块,降低程序的维护风险;
(6)简单工厂模式:定义单独的工厂,解决各模块类的实例化问题。

脑图展开

【设计模式1】简单工厂模式_业务逻辑

核心代码实现(Qt,C++)

(1)最初版本的计算器代码,没有考虑面向对象的编程思想

void Widget::cal()
{
    varA=ui->inAEdit->text().toDouble();
    varB=ui->inBEdti->text().toDouble();
    double ans=0.0;


    try {
        switch(ui->symbolBox->currentIndex()){
        case 0:
            ans=varA+varB;break;
        case 1:
            ans=varA-varB;break;
        case 2:
            ans=varA*varB;break;
        case 3:
            if(varB){
                ans=varA/varB;
            }else{
                throw 0;
            }
        }

    } catch (int i) {
        qDebug()<<"计算错误";
        ui->outEdit->setText(QString("计算错误,分母为 %1").arg(i));
        return ;
    }
    ui->outEdit->setText(QString::number(ans));
}

(2)复用,将界面逻辑层与业务逻辑层分开封装,单独实现计算类

//界面逻辑层
void Widget::cal()
{
    varA=ui->inAEdit->text().toDouble();
    varB=ui->inBEdti->text().toDouble();
    double ans=0.0;

    try {
        if(ui->symbolBox->currentIndex()==3 && varB==0){
            throw 0;
        }
        ans=oper.getResult(varA,varB,ui->symbolBox->currentIndex());
    } catch (int i) {
        qDebug()<<"计算错误";
        ui->outEdit->setText(QString("计算错误,分母为 %1").arg(i));
        return ;
    }
    ui->outEdit->setText(QString::number(ans));
}
//业务逻辑层
double Operation::getResult(double numberA, double numberB, int flag)
{
    double result=0.0f;
    switch (flag) {
    case 0:
        result=numberA+numberB;break;
    case 1:
        result=numberA-numberB;break;
    case 2:
        result=numberA*numberB;break;
    case 3:
        result=numberA/numberB;break;
    }
    return result;
}

(3)简单工厂类,紧耦合 VS 松耦合,运用继承和多态

//界面逻辑层
void Widget::cal()
{
    double varA=ui->inAEdit->text().toDouble();
    double varB=ui->inBEdti->text().toDouble();
    double ans=0.0;

    try {
        if(ui->symbolBox->currentIndex()==3 && varB==0){
            throw 0;
        }

        oper=OperationFactory::createOperator(ui->symbolBox->currentIndex());
        oper->setNumberA(varA);
        oper->setNumberB(varB);
        ans=oper->getResult();
    } catch (int i) {
        qDebug()<<"计算错误";
        ui->outEdit->setText(QString("计算错误,分母为 %1").arg(i));
        return ;
    }
    ui->outEdit->setText(QString::number(ans));
}
//业务逻辑层
class Operation
{
public:
    Operation();
    double getNumberA()
    {
        return numberA;
    }
    double getNumberB()
    {
        return numberB;
    }
    void setNumberA(double var){
        numberA=var;
    }
    void setNumberB(double var){
        numberB=var;
    }

    virtual double getResult()
    {
        double result=0;
        return result;
    }
private:
    double numberA;
    double numberB;
};

class OperationAdd:public Operation{
public:
    double getResult();
};
class OperationSub:public Operation{
public:
    double getResult();
};

class OperationMul:public Operation{
public:
    double getResult();
};
class OperationDiv:public Operation{
    double getResult();
};
//简单工厂类
Operation* OperationFactory::createOperator(int operate)
{
    Operation* oper=nullptr;
    switch (operate) {
        case 0:
            oper=new OperationAdd();break;
        case 1:
            oper=new OperationSub();break;
        case 2:
            oper=new OperationMul();break;
        case 3:
            oper=new OperationDiv();break;
    }
    return oper;
}

Qt效果展示

【设计模式1】简单工厂模式_业务逻辑_02

代码链接

code

关于作者

长期从事编程相关研究,涉及Qt、机械臂、轮式机器人、四足机器人的建模及仿真,可共同探讨编程相关问题,可指导课程设计及毕业设计,详询:QQ:2963325158


举报

相关推荐

0 条评论