【C++深入浅出】设计模式学习之简单工厂
看大话设计模式中大牛对小菜的精辟点评,也写了一个计算器程序,并跟着点评一路改良,还是不过瘾,应用了类模板和异常捕捉机制重写了程序。
本文不能算干货,恰当的比方是饭前甜点,吃一口有点味、有点意思,总归太小不管饱。
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
#include<Windows.h>
#include<exception>
using namespace std;
template <typename T>
class myOperation
{
public:
virtual void SetNumberA(const T& val){NumberA = val;}
virtual void SetNumberB(const T& val){NumberB = val;}
virtual T GetNumberA() {return NumberA;}
virtual T GetNumberB() {return NumberB;}
myOperation(const T& valA, const T& valB) {NumberA = valA; NumberB = valB;}
myOperation(){NumberA = 0; NumberB = 0;}
myOperation(const myOperation& other){NumberA = other.NumverA; NumverB = other.NumberB;}
~myOperation() {}
virtual T Operation() = 0;
private:
T NumberA;
T NumberB;
};
template <typename T>
class myPlusOperation : public myOperation<T>
{
public:
T Operation();
myPlusOperation(){}
myPlusOperation(const T& valA, const T& valB):myOperation(valA, valB){}
myPlusOperation(const myPlusOperation& other){myOperation(other);}
~myPlusOperation(){}
};
template <typename T>
class myMinusOperation : public myOperation<T>
{
public:
T Operation();
myMinusOperation() {}
myMinusOperation(const T& valA, const T& valB):myOperation(valA, valB){}
myMinusOperation(const myMinusOperation& other){myOperation(other);}
~myMinusOperation(){}
};
template <typename T>
class myMultipleOperation : public myOperation<T>
{
public:
T Operation();
myMultipleOperation() {}
myMultipleOperation(const T& valA, const T& valB):myOperation(valA, valB){}
myMultipleOperation(const myMultipleOperation& other){myOperation(other);}
~myMultipleOperation(){}
};
template <typename T>
class myDivideOperation : public myOperation<T>
{
public:
T Operation();
myDivideOperation() {}
myDivideOperation(const T& valA, const T& valB):myOperation(valA, valB){}
myDivideOperation(const myDivideOperation& other){myOperation(other);}
~myDivideOperation(){}
};
template <typename T>
T myPlusOperation<T>::Operation()
{
return GetNumberA()+GetNumberB();
};
template <typename T>
T myMinusOperation<T>::Operation()
{
return GetNumberA()-GetNumberB();
};
template <typename T>
T myMultipleOperation<T>::Operation()
{
return GetNumberA()*GetNumberB();
};
template <typename T>
T myDivideOperation<T>::Operation()
{
if(GetNumberB() == 0)
throw exception("除数不能为0"); //抛出对象,catch引用可以捕捉到
return GetNumberA()/GetNumberB();
};
template <typename T>
class myOperationFactory
{
public:
static myOperation<T>* CreatemyOperation(char operate); //工厂只提供静态方法获取类实例。
};
template <typename T>
myOperation<T>* myOperationFactory<T>::CreatemyOperation(char operate)
{
myOperation<T>* oper = NULL; //返回的指针具有实例化类型,指定<T>
switch (operate)
{
case '+':
oper = new myPlusOperation<T>; //new的对象需要指定实例化类型<T>
break;
case '-':
oper = new myMinusOperation<T>;
break;
case '*':
oper = new myMultipleOperation<T>;
break;
case '/':
oper = new myDivideOperation<T>;
break;
default:
throw new exception("Operation isn't correct"); //new出来的异常,catch对应的指针可以捕捉到
break;
}
return oper;
};
void foo44()
{
try{
while(1)
{
int NumberA = 0, NumberB = 0, Result = 0;
char Oper = '\0';
char Enter = '\0';
printf("please input NumberA\n");
scanf("%d", &NumberA);
printf("please input NumberB\n");
scanf("%d", &NumberB);
printf("please input operator\n");
scanf("%c%c",&Enter, &Oper); //scanf从当前输入流获取下一个匹配的输入,回车换行空格均被视作有效字符
myOperation<int>* Operation = myOperationFactory<int>::CreatemyOperation(Oper);
Operation->SetNumberA(NumberA);
Operation->SetNumberB(NumberB);
Result = Operation->Operation();
printf("Result is %d\n", Result);
delete Operation;
}
/*myPlusOperation<int> Operation(1, 10);
int iResult = Operation.Operation();
printf("iResult is %d\n", iResult);*/
}
//异常捕获之后,try语句块的代码被跳过,程序继续处理以后的代码
catch (exception* ex)
{
cout << ex->what() << endl;
}
catch (exception& ex)
{
cout << ex.what() << endl;
}
catch (...)
{
cout << "catch an unexpected exception" << endl;
}
}
int main()
{
foo44();
system("PAUSE");
}
模板直接支持通用型程序设计,即采用类型作为参数的程序设计,使人在定义类和函数时以类型作为参数,模板的一个广泛应用例子即标准库,主要的标准库被抽象成模板:string、ostream、complex、list、vector等。
例子中演示了简单的类模板应用,稍微要注意的是类声明外部或者引用其他模板类时别忘了实例化参数。
C++的异常捕捉机制基本思想就是:
一个函数发现了自己无法处理的错误时抛出一个异常,希望它的直接或间接调用者能处理这个问题,希望处理这类问题的函数可以表明它将要捕捉这个异常。
C++的异常捕捉机制将异常视为无法再局部执行有意义的动作时,就将控制权返回给调用者。
C++的异常捕捉机制相比传统的错误处理,有许多明显的优越性:
在传统技术不充分、不优美时的替代方法,能明确的将错误处理代码从正常代码中分离,是一种更规范的错误处理风格。
更友好的错误处理方式,异常默认处理方式为跳过错误代码继续处理,而传统的错误处理默认为终止程序,在一些不允许程序垮台的系统上更有用。
异常可以理解成程序不能完成某些工作了,我们可以继续尝试完成其他的工作。
简单工厂模式
简单工厂能较好的支持同一个基类派生出数个派生类的场景,比如本文的加减乘除,基类提供操作数和操作接口,不同职责的派生类重写操作函数,把差异化的功能实现交给派生类完成,这种设计方式便于添加和修改功能,每一个功能的修改只用修改一个类,新增功能也只用新增一个类和类工厂中添加分支,对用户而言则隔离了差异内容的实例化,用户使用时只需要询问一下“嗨,我要做加法操作,你给我返回一个能操作加法的对象指针”。
上面一段描述了简单工厂的三大要素:
工厂角色,被外界调用并创建产品对象,通常提供静态方法获取产品对象。
抽象产品角色,所有具体产品的父类,包含所有实例共有的公共接口。
具体产品角色,一般有多个,工厂创建的具体目标,详细工作的执行者。
【C++深入浅出】设计模式学习之简单工厂的更多相关文章
- Java设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
- 设计模式学习之简单工厂(Simple Factory,创建型模式)(1)
简单工厂(Simple Factory,创建型模式) 第一步: 比如我们要采集苹果和香蕉,那么我们需要创建一个Apple类和Banana类,里面各自有采集方法get(),然后通过main方法进行调用, ...
- java设计模式-----1、简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...
- 深入浅出《设计模式》之简单工厂模式(C++)
前言 模式介绍 简单工厂模式其实并不属于GoF23(23种设计模式),更类似工厂模式的一种变型.其定义是可以根据参数的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实 ...
- Java设计模式学习笔记(三) 工厂方法模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...
- C#设计模式系列:简单工厂模式(Simple Factory)
1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...
- Net设计模式实例之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...
- Java设计模式2:简单工厂模式
简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...
- 大话设计模式C++版——简单工厂模式
简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...
随机推荐
- HDU4907——Task schedule(BestCoder Round #3)
Task schedule Description有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务.有m个询问,每个询问有一个数字q,表示如 ...
- 动态规划晋级——HDU 3555 Bomb【数位DP详解】
转载请注明出处:http://blog.csdn.net/a1dark 分析:初学数位DP完全搞不懂.很多时候都是自己花大量时间去找规律.记得上次网络赛有道数位DP.硬是找规律给A了.那时候完全不知数 ...
- CSS和JavaScript以及Ajax实现预加载图片的方法及优缺点分析
预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画 廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发 ...
- Java面试题-并发容器和框架
1. 如何让一段程序并发的执行,并最终汇总结果? 答:使用CyclicBarrier 和CountDownLatch都可以,使用CyclicBarrier 在多个关口处将多个线程执行结果汇总,Coun ...
- UVa 10622 (gcd 分解质因数) Perfect P-th Powers
题意: 对于32位有符号整数x,将其写成x = bp的形式,求p可能的最大值. 分析: 将x分解质因数,然后求所有指数的gcd即可. 对于负数还要再处理一下,负数求得的p必须是奇数才行. #inclu ...
- Office启动加载vs。。。项
PowerPoint: 选项->加载项->Chinese Translation Addin->管理[COM加载项]转到->取消Chinese Translation Addi ...
- CF GYM 100703G Game of numbers
题意:给n个数,一开始基数为0,用这n个数依次对基数做加法或减法,使基数不超过k且不小于0,输出最远能运算到的数字个数,输出策略. 解法:dp.dp[i][j]表示做完第i个数字的运算后结果为j的可能 ...
- poj 3279 Fliptile
题意:一个n * m的棋盘,0或1,每次改变一个格子时同时改变上下左右的格子,问用最少次数将棋盘全变成0的策略. 题解:用二进制压缩第一行更改的状态,之后遍历棋盘,如果当前格子为1则改变下方的格子,记 ...
- 简单的activemq的封装和使用
天空中飘着小雨,实在是适合写代码的时节. 1 package ch02.chat; import java.io.Serializable; import javax.jms.Connection; ...
- uva 11178
题意:根据A,B,C三点的位置确定D,E,F三个点的位置. 贴模板 #include<cstdio> #include<cmath> #include<cstring&g ...