设计模式(一)——简单工厂模式

本期主题:
用C++实现简单工厂模式例子,并讲解



1.工厂模式是什么

工厂模式是一种创建型的设计模式,客户端不需要指定具体的类而能够直接创建对象。

将创建子类对象的过程推迟到工厂利用得到的信息来创建。

2.例子

实现一个计算器的例子

1 用面向过程的思想来设计

面向过程考虑这个程序非常简单:

  1. 输入运算符和需要计算的数字
  2. 根据输入的运算符来选择对应的公式
  3. 输出结果
int main(void)
{
   char op;
   float num1, num2;

   cout << "请输入运算符 +、-、*、/ :";
   cin >> op;

   cout << "请输入两个运算数:";
   cin >> num1 >> num2;

   switch(op)
   {
      case '+':
         cout << num1+num2;
         break;
      case '-':
         cout << num1-num2;
         break;
      case '*':
         cout << num1 * num2;
         break;
      case '/':
            if (num2 == 0)
            {
                cout << "error不能除以零";
                break;
            }
            else
            {
                cout << num1 / num2;
                break;
            }
      default:
         // 如果运算符不是 +, -, * 或 /, 提示错误信息
         cout << "Error!  请输入正确运算符。";
         break;
   }

   cout << "\n";
   return 0;
}

这种方式的问题:

  1. 不利于后期维护,后期如果再需要加个其他运算符,那么需要把这整个逻辑都暴露给开发者,存在风险;

2 面向对象思想来设计

  1. 运算类作为一个接口,(c++的接口都是用虚函数来实现),其中有虚函数get_result()来返回结果;这个是工厂模式中的产品抽象;
  2. 继承自运算类,有几个具体的产品,就是加法运算类、减法运算类等等…
  3. 工厂类就是创建具体运算类的,通过输入的信息来创建子类,工厂类依赖于运算类,也可以说工厂类需要使用运算类

2.1.UML图

在这里插入图片描述

2.2.代码

//产品 product
class Operate
{
   public:
      float num1;
      float num2;
      virtual int get_result() = 0;
};

//具体产品
class add_operate : public Operate
{
   public:
      int get_result()
      {
         cout << (this->num1 + this->num2) << endl;
         return 0;
      }
};

//工厂类
class Create_oper
{
   public:
      Operate* create_product(char op) //不能直接返回抽象类,需要返回抽象类的指针
      {
         Operate* oper = NULL;
         switch(op)
         {
            case '+':
               cout << "Here is add operation";
               oper = new add_operate(); //调用构造函数
               break;
            default:
               // 如果运算符不是 +, -, * 或 /, 提示错误信息
               cout << "Error!  请输入正确运算符。";
               break;
         }

         if (oper != NULL)
         {
            return oper;
         }
         else
         {
            cout << "工厂类实例化对象失败";
            return NULL;
         }
      }
};

int main()
{
   char op;
   float num1, num2;
   float result;

   cout << "请输入运算符 +、-、*、/ :";
   cin >> op;


   Operate *clac_oper = NULL;
   Create_oper clac_create;
   clac_oper = clac_create.create_product(op);

   cout << "请输入两个运算数:";
   cin >> clac_oper->num1 >> clac_oper->num2;

   clac_oper->get_result();

   delete clac_oper;

   return 0;
}

3 推广工厂模式

在这里插入图片描述
参考链接: 工厂方法模式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值