简单工厂模式的C++实现——设计模式学习(1)


编程目的:使用任意一种面向对象语言实现一个计算器的控制台程序,要求输入两个数和运算符号得到结果。

 

(1)使用面向过程的思想实现计算器的控制台程序

#include <iostream> 

#include <exception>

using namespace std

int main() 

  double numberA

  double numberB

  char operate

 

  cout<<"input number A: "

  cin>>numberA

 

  cout<<"input operator(+ - * /): "

  cin>>operate

 

  cout<<"input number B: "

  cin>>numberB

 

  double result = 0;

 

  switch(operate)

  {

  case '+':

    result = numberA + numberB;

    break;

  case '-':

    result = numberA - numberB;

    break;

  case '*':

    result = numberA * numberB;

    break;

  case '/':

    if (-0.00000001 < numberB && numberB < 0.00000001)//numberB!=0

    {

       cout<<"The divisor cannot be zero.";

    }

    else

    {

      result = numberA / numberB;

    }

    break;

  }

 

  cout<<"result:"<<result<<endl;

  return 0;

}

 

 

(2)上述代码看似考虑完备,实则,尚未考虑用户输入错误的运算符时的异常处理。下面用try,throw,catch对异常进行处理。

 

为程序添加异常处理,

#include <iostream> 

#include <exception>

using namespace std

int main() 

  double numberA

  double numberB

  char operate

 

  cout<<"input number A: "

  cin>>numberA

 

  cout<<"input operator(+ - * /): "

  cin>>operate

 

  cout<<"input number B: "

  cin>>numberB

 

  double result = 0;

 

  try 

  {

    switch(operate)

    {

    case '+':

      result = numberA + numberB;

      break;

    case '-':

      result = numberA - numberB;

      break;

    case '*':

      result = numberA * numberB;

      break;

    case '/':

      if (-0.00000001 < numberB && numberB < 0.00000001)//numberB!=0

      {

        throw exception("The divisor cannot be zero.");//cout<<"The divisor cannot be zero.";

      }

      else

      {

        result = numberA / numberB;        

      }

      break;

    default:

      throw exception("The operator is not correct.");

    }

  }

  catch(exceptione)

  {

    cout<<e.what()<<endl

    exit(1);

  }

 

  cout<<"result:"<<result<<endl;

  return 0;

}

 


(3)上述代码的扩展性、维护性、复用性、灵活性都很不好,而且没有用面向对象的思想。面向对象的三大特性:“封装”“继承”“多态”,可以降低程序的耦合度。

 

使用面向对象的封装特性,将程序的业务逻辑和界面逻辑分开,降低业务和界面的耦合度,

#include <iostream> 

#include <exception>

using namespace std;

 

class Operation

{

public:

  static double getResult(double numberAdouble numberBchar operate)

  {

    double result = 0;

    switch(operate)

    {

    case '+':

      result = numberA + numberB;

      break;

    case '-':

      result = numberA - numberB;

      break;

    case '*':

      result = numberA * numberB;

      break;

    case '/':

      if (-0.00000001 < numberB && numberB < 0.00000001)//numberB!=0

      {

        throw exception("The divisor cannot be zero.");//cout<<"The divisor cannot be zero.";

      }

      else

      {

        result = numberA / numberB;        

      }

      break;

    default:

      throw exception("The operator is not correct.");

    }

    return result;

  }

};

 

int main() 

  double numberA

  double numberB

  char operate

 

  cout<<"input number A: "

  cin>>numberA

 

  cout<<"input operator(+ - * /): "

  cin>>operate

 

  cout<<"input number B: ";  

  cin>>numberB

 

  double result = 0;

 

  try 

  {

    result = Operation::getResult(numberAnumberBoperate);

  }

  catch(exceptione)

  {

    cout<<e.what()<<endl

    exit(1);

  }

 

  cout<<"result:"<<result<<endl;

  return 0;

}

 

 

 

(4)使用面向对象的继承和多态特性,将程序的业务逻辑分离成互不影响的独立模块。

在实例化对象时,使用“简单工厂模式”:用一个单独的类来完成实例的创造过程(工厂),

#include <iostream> 

#include <exception>

using namespace std;

 

//运算类

class Operation

{

//public:

//  static double getResult(double numberA, double numberB, char operate)

//  {

//    double result = 0;

//    switch(operate)

//    {

//    case '+':

//      result = numberA + numberB;

//      break;

//    case '-':

//      result = numberA - numberB;

//      break;

//    case '*':

//      result = numberA * numberB;

//      break;

//    case '/':

//      if (-0.00000001 < numberB && numberB < 0.00000001)//numberB!=0

//      {

//        throw exception("The divisor cannot be zero.");//cout<<"The divisor cannot be zero.";

//      }

//      else

//      {

//        result = numberA / numberB;        

//      }

//      break;

//    default:

//      throw exception("The operator is not correct.");

//    }

//    return result;

//  }

public:

  void SetNumberAdouble a ) 

  { 

    numberA_ = a

  } 

  double GetNumberA() 

  { 

    return numberA_

  } 

 

  void SetNumberBdouble b ) 

  { 

    numberB_ = b

  } 

  double GetNumberB() 

  { 

    return numberB_

  }

   virtual double GetResult() = 0;

protected:

  double numberA_;

  double numberB_;

};

 

//减乘除类(都是继承于运算类的子类)

class OperationAddpublic Operation

{

public

  virtual double GetResult() 

  { 

    return numberA_ + numberB_

  }

};

 

class OperationSubpublic Operation

{

public

  virtual double GetResult() 

  { 

    return numberA_ - numberB_

  }

};

 

class OperationMulpublic Operation

{

public

  virtual double GetResult() 

  { 

    return numberA_ * numberB_

  }

};

 

class OperationDivpublic Operation

{

public

  virtual double GetResult() 

  { 

    if (-0.00000001 < numberB_ && numberB_ < 0.00000001)//numberB!=0

    {

      throw exception("The divisor cannot be zero.");//cout<<"The divisor cannot be zero.";

    }

    return numberA_ / numberB_

  }

};

 

class OperationFactory

{

public

  OperationFactory() 

  { 

    operation_ = NULL

  } 

 

  OperationCreateOperatechar o ) 

  { 

    switcho ) 

    { 

    case '+'

      operation_ = new OperationAdd(); 

      break

    case '-'

      operation_ = new OperationSub(); 

      break

    case '*'

      operation_ = new OperationMul(); 

      break

    case '/'

      operation_ = new OperationDiv(); 

      break

    default

      throw exception("The operator is not correct."); 

    } 

 

    return operation_

  } 

 

  ~OperationFactory() 

  { 

    delete operation_

  } 

 

private

  Operationoperation_

};

 

int main() 

  double numberA

  double numberB

  char operate

 

  cout<<"input number A: "

  cin>>numberA

 

  cout<<"input operator(+ - * /): "

  cin>>operate

 

  cout<<"input number B: "

  cin>>numberB

 

  OperationFactory factory

  Operationoperation;

  try 

  { 

    operation = factory.CreateOperateoperate ); 

  } 

  catch(exceptione

  { 

    cout<<e.what()<<endl

    exit(1); 

  } 

  operation->SetNumberAnumberA );

  operation->SetNumberBnumberB ); 

 

  double result = 0;

 

  try 

  {

    result = operation->GetResult();//Operation::getResult(numberA, numberB, operate);

  }

  catch(exceptione)

  {

    cout<<e.what()<<endl

    exit(1);

  }

 

  cout<<"result:"<<result<<endl;

  return 0;

}

 

总结:设计模式——“简单工厂模式”的运用,可以使程序具备可维护、可复用、可扩展、灵活性好等特点。


VS2010开发环境下所建的完整工程链接:http://download.csdn.net/detail/fan0920/9689619

包含两个zip文件夹calculatorConsole.zip和calculatorConsole2.zip,分别为面向过程思想实现的计算器简单例子(对应于上面的(2)),和面向对象思想实现的计算器简单例子(对应于上面的(4)),其中calculatorConsole2.zip不仅运用的面向对象的封装继承多态三大特性将业务逻辑和界面逻辑加以分离,还增加了异常处理,以及运用了“简单工厂设计模式”,代码的灵活性、扩展性、复用性、维护性都很好,可以很方便的移植到需要GUI的计算器实现中。

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小帆别吃糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值