简单工厂模式 c++实现(大话设计模式系列)

本文主要采用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");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值