本文主要采用c++简单工厂模式进行实现;
该模式实例化对象是通过工厂类,只要输入需要实例化对象的名字,就可以通过工厂对象的相应工厂函数来制造你需要的对象
自动new出一个子类对象并返回其父类的指针
优点
1.隐藏了对象创建的细节,将产品的实例化推迟到子类中实现。
2.客户端基本不用关心使用的是哪个产品,只需要知道用哪个工厂就行了,提供的类型也可以用比较便于识别的字符串。
3.方便添加新的产品子类,每次只需要修改工厂类传递的类型值就行了。
4.遵循了依赖倒转原则。
以下为计算器(实现加减乘除)采用简单工厂模式的例子
#include<memory>
#include<iostream>
using namespace std;
class Operation //运算符类,设置虚方法rusult
{
public:
double GetA(){ return m_NumberA; }
double GetB(){ return m_NumberB; }
void SetA(double NumberA) { m_NumberA = NumberA; }
void SetB(double NumberB) { m_NumberB = NumberB; }
virtual double GetResult() = 0;
private:
double m_NumberA;
double m_NumberB;
};
class OperationAdd:public Operation //各种类Result 的实现
{
public:
double GetResult() { return GetA() + GetB(); }
};
class OperationMul :public Operation
{
public:
double GetResult() { return GetA() * GetB(); }
};
class OperationSub :public Operation
{
public:
double GetResult() { return GetA() - GetB(); }
};
class OperationDiv :public Operation
{
public:
double GetResult();
};
double OperationDiv::GetResult() //除数异常捕获
{
try {
if (GetB() != 0)
return GetA() / GetB();
else
throw runtime_error("除数不能为零");
}
catch (runtime_error err)
{
cout << err.what();
}
}
class OperationFactory //工厂类 用于实例化
{
public:
static Operation* Operationcreate(char ch); //设置为static,不用创建对象也可调用
};
Operation* OperationFactory::Operationcreate(char ch)
{
switch (ch)
{
case '+':
return new OperationAdd();
case '-':
return new OperationSub();
case 'x':
return new OperationMul();
case '/':
return new OperationDiv();
default:cout << "请重新输入运算符"<<endl;
break;
}
};
int main()
{
double A, B;
char ch;
cin >> A >> B >> ch; //用户输入
shared_ptr<Operation>p(OperationFactory::Operationcreate(ch));//智能指针
p->SetA(A);
p->SetB(B);
cout << p->GetResult() << endl; //输出结果
p = NULL; //此时count为0,内存自动销毁
system("pause");
}