实例:

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

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. JAVA String作业——动手动脑以及课后实验性问题

    一:如何解释这样的输出结果?从中你能总结出什么?1.源码 //mao2015.10.20 //==的两个分辨 //对原始数据而言 //对引用类型变量 public class StringPool { ...

  2. 第二周 WBS、NABCD查阅

    WBS WBS:工作分解结构(Work Breakdown Structure) 创建WBS:创建WBS是把项目可交付成果和项目工作分解成较小的,更易于管理的组成部分的过程. WBS是项目管理重要的专 ...

  3. Permutation Sequence [LeetCode]

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  4. Java 集合系列 06 Stack详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  5. 利用sklearn计算文本相似性

    利用sklearn计算文本相似性,并将文本之间的相似度矩阵保存到文件当中.这里提取文本TF-IDF特征值进行文本的相似性计算. #!/usr/bin/python # -*- coding: utf- ...

  6. Java面试题(1)- 高级特性

    1. The diffrence between java.lang.StringBuffer and java.lang.StringBuilder? java.lang.StringBuffer: ...

  7. 使用BroadcastReceiver监听系统接收的短信

    import android.content.BroadcastReceiver;import android.content.Context;import android.content.Inten ...

  8. DatagridView的CellLeave光标离开响应事件,实现某列数字自动求和

    //光标离开DatagridView,循环获取DatagridView的每一行的第3列的值,相加传给重量 private void dgpz_dataGridView_CellLeave(object ...

  9. 6.1.1Linux下Socket编程

    什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程, ...

  10. 1、ViewModel类的构建和INoyifyPropertyChanged的应用

    public class SampleItem : INotifyPropertyChanged { public SampleItem() { } private string title; pub ...