1. 基础介绍
所谓简单工厂模式,是一种实例化对象的方式,只要输入需要实例化对象的名字,就可以通过工厂对象的相应工厂函数来制造你需要的对象。
简单工厂模式的核心是,对于一个父类的多个继承子类,工厂对象的工厂函数根据用户输入,自动new出一个子类对象并返回其父类的指针,这样利用父类的指针执行父类的虚函数,就可以动态绑定子类的重写函数,从而实现多态。
对于一个只拥有加减乘除运算的简单计算器,我们设计一个Operation的父类,并构造加减乘除四个类继承父类重写运算函数GetResult。然后定义工厂类中的工厂函数,其根据用户的输入new出相应的对象实例并返回其父类的指针。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <tr1/memory>
using namespace std;
class Operation
{
private:
double A, B;
public:
double GetA() const {return A;}
double GetB() const {return B;}
void SetA(double x) {A=x;}
void SetB(double y) {B=y;}
double virtual GetResult(){return 0;}
Operation():A(0), B(0){}
};
class Add : public Operation
{
public:
double GetResult()
{
return GetA()+GetB();
}
};
class Sub : public Operation
{
public:
double GetResult()
{
return GetA()-GetB();
}
};
class Mul : public Operation
{
public:
double GetResult()
{
return GetA()*GetB();
}
};
class Div : public Operation
{
public:
double GetResult()
{
return GetA()/GetB();
}
};
class SimpleFactory
{
public:
static Operation * CreateOpeartor(char ch)
{
Operation * p;
switch(ch)
{
case '+':
p = new Add();
break;
case '-':
p = new Sub();
break;
case '*':
p = new Mul();
break;
case '/':
p = new Div();
break;
}
return p;
}
};
int main(int argc, char *argv[])
{
double A = 0;
double B = 0;
char ch = '\0';
cin>>A>>ch>>B;
tr1::shared_ptr<Operation> op(SimpleFactory::CreateOpeartor(ch));
op->SetA(A);
op->SetB(B);
cout<<op->GetResult()<<endl;
}
转载自:http://www.cnblogs.com/jostree/p/4251756.html