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


前言

学习C语言的第一课,就听闻C语言的思想是面向过程的;
学习C++的第一课,就听闻C++是面向对象的;
大家学习面向对象时,是否也曾打趣到:没有对象可以不学吗?
答案肯定是NO。


一、什么是设计模式

1、设计模式简单来说就是使程序变得可维护,可复用,可扩展;
2、可维护:更改时修改的代码量很小
3、可复用:写过的功能可以随时被使用
4、可扩展:添加新功能时,只需对原代码进行少量的调整

二、简单工厂模式

设计一个简单的计算器功能,实现+、-、*、/四个功能

2.1、UML类图

在这里插入图片描述

2.2、代码实现

思路:
1、使用简单工厂模式,定义一个父类为运算类,定义加减乘除四个子类以及一个简单工厂类;
2、通过实例化简单工厂类对象,通过该对象调用成员函数创建父类指针指向子类的对象;
3、通过父类指针调用子类对象中对父类虚函数的重载实现对应加减乘除的功能。

#include <iostream>
#include <string>
using namespace std;
class Operation//父类
{
private:
    float n1;
    float n2;
public:
    Operation(float n1,float n2):n1(n1),n2(n2){}
    float retn1()
    {
        return n1;
    }
    float retn2()
    {
        return n2;
    }
    virtual float GetResult()
    {
        float ret=0;
        return ret;
    }
};
class Add:public Operation//加法
{
public:
    Add(float n1,float n2):Operation(n1,n2){}//构造函数,给父类成员变量初始化
    float GetResult()
    {
       float result=0;
       result=retn1()+retn2();
       return result;
    }
};
class subtract:public Operation//减法
{
public:
    subtract(float n1,float n2):Operation(n1,n2){}
    float GetResult()
    {
       float result=0;
       result=retn1()-retn2();
       return result;
    }
};
class counter:public Operation//乘法
{
public:
    counter(float n1,float n2):Operation(n1,n2){}
    float GetResult()
    {
       float result=0;
       result=retn1()*retn2();
       return result;
    }
};
class divide:public Operation//除法
{
public:
    divide(float n1,float n2):Operation(n1,n2){}
    float GetResult()
    {
       float result=0;
       if(retn2()==0)
       {
           cout<<"输出不规范"<<endl;
           return -1;
       }
       result=retn1()/retn2();
       return result;
    }
};
class OperationFactory//简单工厂
{
public:
    static Operation *CreateOperate(char operate,float n1,float n2)
    {
        Operation *oper=NULL;
        switch(operate)
        {
            case'+':
                oper=new Add(n1,n2);
                break;
            case'-':
                oper=new subtract(n1,n2);
                break;
            case'*':
                oper=new counter(n1,n2);
                break;
            case'/':
                oper=new divide(n1,n2);
                break;
        }
        return oper;
    }
};
int main()
{
    float n1,n2;
    char oper;
    while(1)//死循环加阻塞,可以重复测试数据
    {
        cin>>n1>>oper>>n2;
        Operation *ret=OperationFactory::CreateOperate(oper,n1,n2);
        float res=ret->GetResult();
        cout<<res<<endl;
    }
    return 0;
}

总结

1、优秀的代码不止可以实现想要的功能,还要拥有可维护,可复用,可扩展三大特性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值