实例:

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

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. [Jetty] jetty 内存调优

    在start.ini中配置代码如下 -Dcom.sun.management.jmxremote=true -Xmx6144m -XX:PermSize=256M -XX:MaxPermSize=10 ...

  2. Git分支管理详解

    内容来源:http://blog.jobbole.com/25775/ Git简介 Git是分布式版本控制工具:Git 收取的是项目历史的所有数据(每一个文件的每一个版本),服务器上有的数据克隆之后本 ...

  3. border用处多

    1. 使用border属性实现梯形    给定一个div,通过设定div四个边框不同的颜色且设置比较粗的边框线条,可以看到div除了中间的content部分,四个边框均成梯形状,既然已经有了梯形的雏形 ...

  4. Mysql 修改列的顺序

    alter table 表名 modify 字段名 字段类型 after 字段举例alter table user_info modify user_name varchar(10) after us ...

  5. GO工程和包

    转载:http://blog.csdn.net/achelloworld/article/details/43956831 在Go语言中,包是函数与数据的集合,用package定义一个包,包的名字不一 ...

  6. checkbox改成radio效果,单选,取消

    $(function () {            var allBox = $(":checkbox");            allBox.click(function ( ...

  7. easy_install jinja2 mac linux

    error: can't create or remove files in install directory The following error occurred while trying t ...

  8. 哈希(Hask)

     编辑 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射 ...

  9. pthreads 0.1.0 测试报告

    1 可以说已经稳定了 2 发现一个算是技巧的东西吧:在线程之间传递的类的实例,要保证能正常工作,需要类本身extends Stackable,所有方法都弄成public--我原来了写了一个数据库操作类 ...

  10. Linux的三种特殊权限

    1.Suid Set位权限 ●对文件以文件的拥有者身份执行文件 ●对目录无影响 权限设置: ●suid=u+s 2.Sgid Set位权限 ●对文件以文件的组身份执行文件 ●对目录在目录中最新创建的文 ...