实例:

实现一个简单的计算器。实现加减乘除等操作。。

operator.h 文件

// copyright @ L.J.SHOU Mar.13, 2014
// a simple calculator using Factory Design Pattern
#ifndef OPERATOR_H_
#define OPERATOR_H_ #include <string>
#include <iostream>
#include <stdexcept> // base class
class Operator
{
public:
Operator(double lhs, double rhs)
: numberA(lhs), numberB(rhs){} virtual double GetResult() = 0; protected:
double numberA;
double numberB;
}; // "+"
class OperatorAdd : public Operator
{
public:
OperatorAdd(double lhs, double rhs)
: Operator(lhs, rhs) { } double GetResult() { return numberA + numberB; }
}; // "-"
class OperatorMinus : public Operator
{
public:
OperatorMinus(double lhs, double rhs)
: Operator(lhs, rhs) { } double GetResult() { return numberA - numberB; }
}; // "*"
class OperatorMul : public Operator
{
public:
OperatorMul(double lhs, double rhs)
: Operator(lhs, rhs) { } double GetResult() { return numberA * numberB; }
}; // "/"
class OperatorDiv : public Operator
{
public:
OperatorDiv(double lhs, double rhs)
: Operator(lhs, rhs) { } double GetResult() {
if(numberB == 0)
throw std::runtime_error("divide zero !!!");
return numberA / numberB;
}
}; // factory function
Operator* createOperator(std::string oper, double lhs, double rhs)
{
Operator* pOper(NULL); if(oper == "+")
{
pOper = new OperatorAdd(lhs, rhs);
}
else if(oper == "-")
{
pOper = new OperatorMinus(lhs, rhs);
}
else if(oper == "*")
{
pOper = new OperatorMul(lhs, rhs);
}
else if(oper == "/")
{
pOper = new OperatorDiv(lhs, rhs);
}
else
{
std::cerr << "not a valid operator" << std::endl;
return NULL;
} return pOper;
} #endif

operator.cc 文件

// copyright @ L.J.SHOU Mar.13, 2014
// a simple calculator using Factory Design Pattern #include "operator.h"
#include <iostream>
#include <stdexcept>
#include "boost/shared_ptr.hpp"
using namespace std; int main(void)
{
try{
boost::shared_ptr<Operator> pOper(createOperator("+", 0, 1));
cout << pOper->GetResult() << endl; pOper = boost::shared_ptr<Operator>(createOperator("-", 0, 1));
cout << pOper->GetResult() << endl; pOper = boost::shared_ptr<Operator>(createOperator("*", 2, 3));
cout << pOper->GetResult() << endl; pOper = boost::shared_ptr<Operator>(createOperator("/", 1, 0));
cout << pOper->GetResult() << endl;
}
catch(std::runtime_error err){
std::cout << err.what()
<< std::endl;
} return 0;
}

参考:

大话设计模式

Design Patterns----简单的工厂模式的更多相关文章

  1. Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)

    Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...

  2. js简单的工厂模式

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  3. JS模式:又一个简单的工厂模式

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  4. JS创建对象的四种简单方式 (工厂模式和自定义构造函数创建对象的区别)

    // 对象:特指的某个事物,具有属性和方法(一组无序的属性的集合) // 特征------>属性 // 行为------>方法 // 创建对象的四种方式 1 // 1.字面量的方式,就是实 ...

  5. java简单的工厂模式

    定义:专门定义一个类来创建其他类的实例,被创建的实例通常都具有共同的父类和接口.意图:提供一个类由它负责根据一定的条件创建某一及具体类的实例 //简单工厂,存在不符合开闭原则的地方,可以在参考抽象工厂 ...

  6. C#调用短信接口(通过简单的工厂模式整合多个短信平台)

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  7. c++ 设计模式之简单的工厂模式

    调试环境:vs2010 // test0.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...

  8. [Java反射机制]用反射改进简单工厂模式设计

    如果做开发的工作,工厂设计模式大概都已经深入人心了,比较常见的例子就是在代码中实现数据库操作类,考虑到后期可能会有数据库类型变换或者迁移,一般都会对一个数据库的操作类抽象出来一个接口,然后用工厂去获取 ...

  9. java之设计模式工厂三兄弟之简单工厂模式

    [学习难度:★★☆☆☆,使用频率:★★★☆☆] 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式.本章将要学习的简单工厂模式是工厂方法模式的& ...

随机推荐

  1. ember

    为什么要用这种单页面应用.单页面应用就可以是一个web app ,而不是一个web site了,但是百度的大王是退mvc的,考虑到gc什么的? 所以说写组件component和mvc压根是两个完全从角 ...

  2. nodeschool.io 4

    ~~ MY FIRST ASYNC I/O! ~~ Write a program that uses a single asynchronous filesystem operationto rea ...

  3. java编程思想

    Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...

  4. hdu----(1466)计算直线的交点数(dp)

    计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  5. c# xml的增删改查操作 xmlDocument 的用法

    1.将xml转换为DataTable string path = "";//xml的位置StringReader sr = null;XmlTextReader xmlReader ...

  6. js 获得每周周日到周一日期

    //得到每周的第一天(周日)function getFirstDateOfWeek(theDate){ var firstDateOfWeek; theDate.setDate(theDate.get ...

  7. 使用Lucene.Net管理索引实现搜索

    之前使用一直是没有问题的,只到今天发现删除的时候无法删除,增加的时候却一直在增加,导致搜索的时候可以搜出来很多相同的结果. 小猪决定趁今天这个机会好好的把这个问题给解决了. private void ...

  8. uiwebview 清缓存。,mark

    //清除cookies NSHTTPCookie *cookie; NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCook ...

  9. 基于MVC的应用框架之Struts前奏

    1.JSP&Servlet中的MVC MVC的关键是,业务逻辑要与表示分离.通过把业务逻辑放在一个“模型”中,这样业务逻辑本身就能作为一个可重用的JAVA类存在. 在JSP&Servl ...

  10. POJ 2104 静态找区间第k大

    静态区间第k大的问题,往往可以利用主席树来解决 这是主席树的第一道题 主席树大概可以理解为在n个节点上都建立一棵线段树,但是想想会超出内存 每一个节点保存的线段树都记录当前整段前缀区间的信息 但是因为 ...