1. 程式人生 > >c++ 實現工廠模式

c++ 實現工廠模式

        工廠模式大家都很熟悉了,就是利用多型,利用基類指標指向新生成的派生類,用該指標呼叫派生類的函式。

今天看《effective c++》寫程式碼主要是練習一下,程式碼中類實現沒有考慮太多的建構函式及虛構函式,各位見諒。

#include<iostream>
#include<string>
using namespace std;


class Operation
{
public:
	void setNumA(double d1)
	{
		numA = d1;
	}
	void setNumB(double d2)
	{
		numB = d2;;
	}
	double getNumA() const
	{
		return numA;
	}
	double getNumB() const
	{
		return numB;
	}
	double virtual getResult() = 0;
private:
	double numA;
	double numB;
};

class OperationAdd : public Operation
{
public:
	double getResult();
};

double OperationAdd::getResult()
{
	return getNumA() + getNumB();
}

class OperationSub : public Operation
{
public:
	double getResult();
};
double OperationSub::getResult()
{
	return  getNumA() - getNumB();
}

class OperationMul : public Operation
{
public:
	double getResult();	
};

double OperationMul::getResult()
{
	return getNumA() * getNumB();
}

class OperationDiv : public Operation
{
public:
	double getResult();
};

double OperationDiv::getResult()
{
	if (getNumB() == 0)
	{
		cout << " the divisor can't be zero " << endl;
		throw runtime_error("the divisor can't be zero");
	}
	return getNumA() / getNumB();
}

class OperationFactory
{
public:
	static Operation * createOperation(char operate)
	{
		Operation *oper;
		switch(operate)
		{
		case '+' :
			oper = new OperationAdd;
			break;
		case '-':
			oper = new OperationSub;
			break;
		case '*':
			oper = new OperationMul;
			break;
		case '/':
			oper = new OperationDiv;
			break;
		default:
			cout << " can't reconginze the operate " << endl;
			oper = 0;
		}
	return oper;
	}
};


int main()
{
	double numA;
	double numB;
	char operate;
	cout << " Please input two params " << endl;
	cout << " numA = ";
	cin >> numA;
	cout << " numB = ";
	cin >> numB;
	OperationFactory factory;

	cout << "Please input operate : ";
	cin>> operate;

	Operation *operation = factory.createOperation(operate);
	operation->setNumA(numA);
	operation->setNumB(numB);
	cout << " The result of " << numA << " " << operate <<"  " << numB << " = " << operation->getResult() << endl;

	delete operation;
	system("pause");
	return 0;
}