看大话设计模式中大牛对小菜的精辟点评,也写了一个计算器程序,并跟着点评一路改良,还是不过瘾,应用了类模板和异常捕捉机制重写了程序。

本文不能算干货,恰当的比方是饭前甜点,吃一口有点味、有点意思,总归太小不管饱。

#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++深入浅出】设计模式学习之简单工厂的更多相关文章

  1. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

  2. 设计模式学习之简单工厂(Simple Factory,创建型模式)(1)

    简单工厂(Simple Factory,创建型模式) 第一步: 比如我们要采集苹果和香蕉,那么我们需要创建一个Apple类和Banana类,里面各自有采集方法get(),然后通过main方法进行调用, ...

  3. java设计模式-----1、简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...

  4. 深入浅出《设计模式》之简单工厂模式(C++)

    前言 模式介绍 简单工厂模式其实并不属于GoF23(23种设计模式),更类似工厂模式的一种变型.其定义是可以根据参数的不同返回不同类的实例.简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实 ...

  5. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  6. C#设计模式系列:简单工厂模式(Simple Factory)

    1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...

  7. Net设计模式实例之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...

  8. Java设计模式2:简单工厂模式

    简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...

  9. 大话设计模式C++版——简单工厂模式

    简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...

随机推荐

  1. *MySQL卸载之后无法重装,卡在Apply security settings:Error Nr.1045

  2. 优化Hoax or what的思考

    在抽取MinHeap的时候,涉及到重载,覆盖,虚函数等,有几点之前没注意到的问题在这里总结下: 1. 覆盖(override)只要是函数同名就会被覆盖,子类指针若调用父类的同名不同参数的函数的话,会在 ...

  3. HTTP代理协议 HTTP/1.1的CONNECT方法

    我们平时使用HTTP协议无非就是GET.POST这些方法,但是HTTP的内容远不止那些.今天就来说说HTTP代理使用的CONNECT.这个不是在网页开发上用的,如果没兴趣就跳过吧. APACHE只是作 ...

  4. 发现可高速缓存的 SSL 页面

    发现可高速缓存的 SSL 页面 技术描述: 缺省情况下,大部分 Web 浏览器都配置成会在使用期间高速缓存用户的页面. 这表示也会高速缓存 SSL 页面.不建议让 Web 浏览器保存任何 SSL 信息 ...

  5. JS复制对象

    CSSCommonJS.DeepCopy = function (json) { if (typeof json == 'number' || typeof json == 'string' || t ...

  6. Git教程(2)官方命令文档及常用命令表

    http://www.cnblogs.com/angeldevil/archive/2013/11/26/3238470.html 1,官方命令文档 http://www.git-scm.com/do ...

  7. C#读取注册表信息

    注册表是视窗系统的一个核心的数据库,在这个数据库中存放中与系统相关的各种参数,这些参数直接控制中系统的启动.硬件的驱动程序安装信息以及在视窗系统上运行的各种应用程序的注册信息等.这就意味着,如果注册表 ...

  8. 【HDOJ】4029 Distinct Sub-matrix

    思路是枚举矩阵列数,然后将字符矩阵转换成字符串,通过字符数组求不同子串数目.最后,减去不成立的情况.使用特殊字符分割可能的组合. /* 4029 */ #include <iostream> ...

  9. How does it work in C#? - Part 3 (C# LINQ in detail)

    http://www.codeproject.com/Articles/383749/How-does-it-work-in-Csharp-Part-Csharp-LINQ-in-d

  10. C语言中的malloc和free

    最近在研究php自定义函数的实现,其中php自定义函数在传递参数时,是放到人为的一个栈中,这个跟写C程序时,参数入栈的这个栈还不一样,其中延伸到了 malloc 以及free 有人说在free(p)后 ...