#include <iostream>
using namespace std;
template <typename T>
class BaseOper
{
public:
void SetParam(const T& a, const T& b)
{
this->a = a;
this->b = b;
}
virtual T GetResult() = 0;
protected:
T a;
T b;
};
template <typename T>
class AddOper : public BaseOper<T>
{
public:
T GetResult()
{
return a + b;
}
};
template <typename T>
class SubOper : public BaseOper<T>
{
public:
T GetResult()
{
return a - b;
}
};
template <typename T>
class MultiOper : public BaseOper<T>
{
public:
T GetResult()
{
return a * b;
}
};
template <typename T>
class DivOper : public BaseOper<T>
{
public:
T GetResult()
{
return a / b;
}
};
template <typename T>
class BaseFactory
{
public:
virtual BaseOper<T>* CreateOper() = 0;
};
// add
template <typename T>
class AddFactory : public BaseFactory<T>
{
public:
virtual BaseOper<T>* CreateOper()
{
return new AddOper<T>();
}
};
// sub
template <typename T>
class SubFactory : public BaseFactory<T>
{
public:
virtual BaseOper<T>* CreateOper()
{
return new SubOper<T>();
}
};
// div
template <typename T>
class DivFactory : public BaseFactory<T>
{
public:
virtual BaseOper<T>* CreateOper()
{
return new DivOper<T>();
}
};
// mul
template <typename T>
class MulFactory : public BaseFactory<T>
{
public:
virtual BaseOper<T>* CreateOper()
{
return new MultiOper<T>();
}
};
int main(int argc, char *argv[])
{
BaseFactory<int> *pBaseFactory = new AddFactory<int>();
BaseOper<int> *pAddOp = pBaseFactory->CreateOper();
pAddOp->SetParam(2,3);
cout << pAddOp->GetResult() << endl;
delete pAddOp;
delete pBaseFactory;
getchar();
}
factory model
最新推荐文章于 2023-04-09 12:30:46 发布