前言
学习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、优秀的代码不止可以实现想要的功能,还要拥有可维护,可复用,可扩展三大特性