首页 > 编程语言 >C++ 设计模式之简单工厂模式

C++ 设计模式之简单工厂模式

时间:2023-07-07 13:48:16浏览次数:61  
标签:oper virtual getResult 工厂 COperator C++ template 设计模式 public

设计模式之简单工厂模式(C++)
  简单工厂模式,主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。优点:适用于不同情况创建不同的类时。缺点:客户端必须要知道基类和工厂类,耦合性差。需要根据不同的需求创建不同的类。添加类的时候需要更爱工厂类。
以四则运算为例,其UML图如下:

 在客户端中给简单工厂类传递相关参数,工厂根据参数判断要create什么类型的对象,然后返回该对象。示例代码如下:

 1 // SimpleFactoryModel.h文件
 2 #pragma once
 3 
 4 // 操作基类
 5 template<typename T>
 6 class COperator
 7 {
 8 public:
 9     virtual T getResult() = 0;
10     virtual void setArgs(T lpa, T rpa);
11 protected:
12     T lah, rah;
13 };
14 
15 template<typename T>
16 void COperator<T>::setArgs(T lpa, T rpa)
17 {
18     lah = lpa;
19     rah = rpa;
20 }
21 // 加法类
22 template<typename T>
23 class CAddOperator : public COperator<T>
24 {
25 public:
26     virtual T getResult()
27     {
28         return COperator<T>::lah + COperator<T>::rah;
29     }
30 };
31 // 减法类
32 template<typename T>
33 class CSubOperator : public COperator<T>
34 {
35 public:
36     virtual T getResult()
37     {
38         return COperator<T>::lah - COperator<T>::rah;
39     }
40 };
41 // 乘法类
42 template<typename T>
43 class CMulOperator : public COperator<T>
44 {
45 public:
46     virtual T getResult()
47     {
48         return COperator<T>::lah * COperator<T>::rah;
49     }
50 };
51 // 除法类
52 template<typename T>
53 class CDivOperator : public COperator<T>
54 {
55 public:
56     virtual T getResult()
57     {
58         if (0 == COperator<T>::rah)
59         {
60             std::cout << "除数不能为0" << std::endl;
61             return 0;
62         }
63         return COperator<T>::lah / COperator<T>::rah;
64     }
65 };
66 // 工厂类
67 template<typename T>
68 class CCalculatorFactory
69 {
70 public:
71     static COperator<T> * createObject(char c);
72 };
73 
74 template<typename T>
75 COperator<T> * CCalculatorFactory<T>::createObject(char c)
76 {
77     COperator<T> * oper;
78     switch (c)
79     {
80     case '+':
81         oper = new CAddOperator<T>();
82         break;
83     case '-':
84         oper = new CSubOperator<T>();
85         break;
86     case '*':
87         oper = new CMulOperator<T>();
88         break;
89     case '/':
90         oper = new CDivOperator<T>();
91         break;
92     default:
93         oper = new CAddOperator<T>();
94         break;
95     }
96     return oper;
97 }

测试代码如下:

 1 #include <iostream>
 2 #include "SimpleFactoryModel.h"
 3 
 4 int main()
 5 {
 6     using namespace std;
 7     // 创建对象
 8     COperator<double> *p = CCalculatorFactory<double>::createObject('/');
 9     p->setArgs(23.23, 10.74);
10 
11     cout << p->getResult() << endl;
12     delete p;
13 
14     p = CCalculatorFactory<double>::createObject('+');
15     p->setArgs(23.23, 10.74);
16     cout << p->getResult() << endl;
17     delete p;
18 
19     p = CCalculatorFactory<double>::createObject('-');
20     p->setArgs(23.23, 10.74);
21     cout << p->getResult() << endl;
22     delete p;
23 
24     p = CCalculatorFactory<double>::createObject('*');
25     p->setArgs(23.23, 10.74);
26     cout << p->getResult() << endl;
27     delete p;
28 
29     getchar();
30     return 0;
31 
32     getchar();
33     return 0;
34 }

测试输出如下:

   简单工厂模式破坏了开放-封闭原则,当想添对象类型的时候,例如上例中想添加一个‘^’的运算,则需要添加一个乘方类并且需要修改简单工厂类。这是简单工工厂模式的一个缺点,因为我们最好遵循只添加不修改的原则,即开放-封闭原则。

标签:oper,virtual,getResult,工厂,COperator,C++,template,设计模式,public
From: https://www.cnblogs.com/ybqjymy/p/17534719.html

相关文章

  • C++ 设计模式之组合模式
    设计模式之组合模式组合模式,将对象组合成属性结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。其UML图如下:一个组织有很多子组织,而无论子组织是单独一个部门或是一个分组织。该组织都希望把它们当成一样的子组织来管理。......
  • C++ 设计模式之单例模式
    设计模式之单例模式保证一个类仅有一个实例,并提供一个访问他的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且可以提供一个访问该实例......
  • C++学生健康信息收集系统[2023-07-06]
    C++学生健康信息收集系统[2023-07-06]学生健康信息收集系统简介一、 问题描述为了应对新型冠状病毒疫情,学校需要开发一个能够每天收集全校学生健康信息的系统,便于学校管理。不同学院以及学校的管理员,需要能方便地查看和导出健康状况异常的学生列表,并能对各类信息进行查看和统计......
  • C/C++学生通讯录管理系统[2023-07-06]
    C/C++学生通讯录管理系统[2023-07-06]一、设计要求1、题目利用C++语言实现一个学生通讯录管理系统,系统中需要实现的功能如下:(1)添加学生信息:向通讯录中添加新人,信息包括(学生姓名、性别、年龄、联系电话、家庭住址等),最多记录100人。(2)显示学生信息:显示通讯录中所有学生信息。(3)删......
  • C++ 设计模式之桥接模式
    设计模式之桥接模式桥接模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里说的实现分离,并不是说然抽象类与派生类分离,这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。其UML图如下: 结合上图理解一下其定义。抽象部分指的是Abstraction......
  • C/C++订餐管理系统[2023-07-07]
    C/C++订餐管理系统[2023-07-07]1、订餐管理系统要求实现饭店的订餐信息管理,包括菜单管理、订单管理、统计分析。实现菜单信息(菜号、菜名、价格、成本)的增删改查;实现订单管理(订单号、就餐人数、下单时间、订单总价、订单包含的所有菜品(菜号、数量))。系统功能包括以下方面:A、菜......
  • 学习C++这一篇就够了(进阶篇)
    ​内存模型C++在执行程序的时候,将内存方向划分为4个区域:代码区:存放二进制代码,由操作系统进行管理全局区:存放全局变量、静态变量、常量,程序结束后由操作系统释放栈区:存放函数参数、局部变量,由编译器自动分配和释放堆区:由开发者申请分配和释放,若程序员不释放,程序结束由......
  • C++ 中的函数重载
     在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。https://www.121mu.com/bkjq211/......
  • C++ 多态
     多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。下面的实例中,基类Shape被派生为两个类https://www.121mu.com/czss/......
  • C++ 中的运算符重载
     您可以重定义或重载大部分C++内置的运算符。这样,您就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数,函数名是由关键字operator和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。https://www.micsoon.com/bkzn19/......