五、工廠模式

工廠模式(Factory Method):定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使得一個類的實例化延遲到其子類。

//Operation.h
#ifndef _OPERATION_H_
#define _OPERATION_H_
class Operation
{
public:
	virtual double GetResult()=0;
public:
	double _num1,_num2;
};

class OperationAdd:public Operation
{
public:
	double GetResult();
};
class OperationSub:public Operation
{
public:
	double GetResult();
};
class OperationMul:public Operation
{
public:
	double GetResult();
};

class OperationDiv:public Operation
{
public:
	double GetResult();
};
#endif



//Operation.cpp
#include "Operation.h"
#include <iostream>
#include <iostream>
using namespace std;

double OperationAdd::GetResult()
{
	return _num1+_num2;
}

double OperationSub::GetResult()
{
	return _num1-_num2;
}

double OperationMul::GetResult()
{
	return _num1*_num2;
}

double OperationDiv::GetResult()
{
	if (!_num2)
	{
		return _num1/_num2;
	}
	else
		cout<<"除數不能爲0"<<endl;
	return 0;
	
}

//Factory.h
#ifndef _FACTORY_H
#define _FACTORY_H

class Operation;
class OperationFactory
{
public:
	virtual Operation* CreateOperation()=0;
};
class AddFactory:public OperationFactory
{
	Operation* CreateOperation();
};
class SubFactory:public OperationFactory
{
	Operation* CreateOperation();
};
class MulFactory:public OperationFactory
{
	Operation* CreateOperation();
};
class DivFactory:public OperationFactory
{
	Operation* CreateOperation();
};
#endif

//Factory.cpp
#include "Operation.h"
#include "Factory.h"

Operation* AddFactory::CreateOperation()
{
	return new OperationAdd();
}
Operation* SubFactory::CreateOperation()
{
	return new OperationSub();
}
Operation* MulFactory::CreateOperation()
{
	return new OperationMul();
}
Operation* DivFactory::CreateOperation()
{
	return new OperationDiv();
}

//main.cpp
#include <iostream>
#include "Factory.h"
#include "Operation.h"
using namespace std;

int main()
{
	char operate;
	double numA;
	double numB;
	Operation* op=NULL;
	OperationFactory* of= NULL;
	cout<<"請輸入數字1:";
	cin>>numA;
	cout<<"請輸入運算符:";
	cin>>operate;
	cout<<"請輸入數字2:";
	cin>>numB;
	switch(operate)
	{
	case '+':of = new AddFactory();break;
	case '-':of = new SubFactory();break;
	case '*':of = new MulFactory();break;
	case '/':of = new DivFactory();break;
	default:cout<<"算符輸入錯誤!"<<endl;
	return 0;
	}
	op = of->CreateOperation();
	op->_num1 = numA;
	op->_num2 = numB;

	double result = op->GetResult();
	cout<<result;
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章