// designpattern8_operation.cpp : 定义控制台应用程序的入口点。
//工厂方法模式
#include<iostream>
#include<stdlib.h>
#include<string>
#include<algorithm>
using namespace std;
class Operation
{
public:
virtual double GetResult()
{
std::cout << "Operartion" << std::endl;
double result = 0;
return result;
}
double NumebleA = 0;
double NumebleB = 0;
};
class OperationAdd :public Operation
{
public:
double GetResult() override
{
std::cout << "+" ;
double result = 0;
result = NumebleA + NumebleB;
return result;
}
};
class OperationSub :public Operation
{
public:
double GetResult() override
{
std::cout << "-" << std::endl;
double result = 0;
result = NumebleA - NumebleB;
return result;
}
};
class OperationMul :public Operation
{
public:
double GetResult() override
{
std::cout << "*" << std::endl;
double result = 0;
result = NumebleA * NumebleB;
return result;
}
};
class OperationDiv :public Operation
{
public:
double GetResult() override
{
std::cout << "/" << std::endl;
double result = 0;
if (NumebleB == 0)
{
std::cerr << "error of dividing zero.\n";
exit(1);
}//异常退出程序
result = NumebleA / NumebleB;
return result;
}
};
class IFactory
{
public:
virtual Operation* CreateOperation() = 0;
};
class AddFactory :public IFactory
{
public:
Operation* CreateOperation()
{
return new OperationAdd();
}
};
class SubFactory :public IFactory
{
public:
Operation* CreateOperation()
{
return new OperationSub();
}
};
class MulFactory :public IFactory
{
public:
Operation* CreateOperation()
{
return new OperationMul();
}
};
class DivFactory :public IFactory
{
public:
Operation* CreateOperation()
{
return new OperationDiv();
}
};
int main(int arg, char* argv[])
{
IFactory* operFactory = new AddFactory();
Operation *oper = operFactory->CreateOperation();
oper->NumebleA = 1;
oper->NumebleB = 7;
cout << oper->NumebleA;
double result = oper->GetResult();
cout << oper->NumebleB << "=" << result << endl;
return 0;
}
//工厂方法模式
工厂方法模式(Factory Method):定义一个用于创建对象的接口,
让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
#include<iostream>
#include<stdlib.h>
#include<string>
#include<algorithm>
using namespace std;
class Operation
{
public:
virtual double GetResult()
{
std::cout << "Operartion" << std::endl;
double result = 0;
return result;
}
double NumebleA = 0;
double NumebleB = 0;
};
class OperationAdd :public Operation
{
public:
double GetResult() override
{
std::cout << "+" ;
double result = 0;
result = NumebleA + NumebleB;
return result;
}
};
class OperationSub :public Operation
{
public:
double GetResult() override
{
std::cout << "-" << std::endl;
double result = 0;
result = NumebleA - NumebleB;
return result;
}
};
class OperationMul :public Operation
{
public:
double GetResult() override
{
std::cout << "*" << std::endl;
double result = 0;
result = NumebleA * NumebleB;
return result;
}
};
class OperationDiv :public Operation
{
public:
double GetResult() override
{
std::cout << "/" << std::endl;
double result = 0;
if (NumebleB == 0)
{
std::cerr << "error of dividing zero.\n";
exit(1);
}//异常退出程序
result = NumebleA / NumebleB;
return result;
}
};
class IFactory
{
public:
virtual Operation* CreateOperation() = 0;
};
class AddFactory :public IFactory
{
public:
Operation* CreateOperation()
{
return new OperationAdd();
}
};
class SubFactory :public IFactory
{
public:
Operation* CreateOperation()
{
return new OperationSub();
}
};
class MulFactory :public IFactory
{
public:
Operation* CreateOperation()
{
return new OperationMul();
}
};
class DivFactory :public IFactory
{
public:
Operation* CreateOperation()
{
return new OperationDiv();
}
};
int main(int arg, char* argv[])
{
IFactory* operFactory = new AddFactory();
Operation *oper = operFactory->CreateOperation();
oper->NumebleA = 1;
oper->NumebleB = 7;
cout << oper->NumebleA;
double result = oper->GetResult();
cout << oper->NumebleB << "=" << result << endl;
return 0;
}