- 【笔记】大话设计模式-1简单工厂模式
- 1 简介
- 2 代码
- 2.1 定义基类
- 2.2 创建派生类对象,这里以加减乘除为例
- 2.3 创建工厂
- 2.4 调用工厂函数
说白了,就是考虑用一个单独的类来做创造实例的过程,这就是工厂。
工厂就是实例化出合适的对象,通过多态,返回基类的方式。
举个例子,我想买一双鞋,一般情况下,我要去各个品牌店去买对应的鞋子,太麻烦了,现在,我直接去一家工厂,告诉工厂我要一双"王五"牌鞋子,工厂就直接给你了,这就是工厂方便的地方。将你所需要的实例直接给你。
好处:将来新增派生类的时候,对外提供的接口函数可以保持不变,只需新增派生类,并改变工厂的入参即可。
2 代码 2.1 定义基类创建一个操作的基类,操作两个数,得到一个结果
// 基类
class Operation
{
public:
Operation() {};
~Operation() {};
inline double GetNumberA()
{
return numberA;
}
inline void SetNumberA(double a)
{
numberA = a;
}
inline double GetNumberB()
{
return numberB;
}
inline void SetNumberB(double b)
{
numberB = b;
}
virtual double GetResult()
{
double result = 0.0;
return result;
}
private:
double numberA{ 0.0 };
double numberB{ 0.0 };
};
2.2 创建派生类对象,这里以加减乘除为例
// 加法
class OperationAdd : public Operation
{
double GetResult() override;
};
double OperationAdd::GetResult()
{
double result = GetNumberA() + GetNumberB();
return result;
};
// 减法
class OperationSub : public Operation
{
double GetResult() override;
};
double OperationSub::GetResult()
{
double result = GetNumberA() - GetNumberB();
return result;
}
// 乘法
class OperationMul : public Operation
{
double GetResult() override;
};
double OperationMul::GetResult()
{
double result = GetNumberA() * GetNumberB();
return result;
}
// 除法
class OperationDiv : public Operation
{
double GetResult() override;
};
double OperationDiv::GetResult()
{
if (fabs(GetNumberB() - 0.0) < 1e-10) {
std::cout << "The divisor can not be 0!" << std::endl;
return 0.0;
}
double result = GetNumberA() / GetNumberB();
return result;
}
2.3 创建工厂
// ========= 工厂函数 =========
class OperationFactory
{
public:
OperationFactory();
~OperationFactory();
Operation* CreateOperate(char operate);
void DeleteOperate();
private:
Operation* oper;
};
OperationFactory::OperationFactory()
{
oper = nullptr;
}
OperationFactory::~OperationFactory()
{
}
Operation* OperationFactory::CreateOperate(char operate)
{
switch (operate)
{
case '+':
oper = new OperationAdd();
break;
case '-':
oper = new OperationSub();
break;
case '*':
oper = new OperationMul();
break;
case '/':
oper = new OperationDiv();
break;
default:
oper = new OperationAdd();
break;
}
return oper;
}
void OperationFactory::DeleteOperate()
{
if (oper != nullptr){
delete oper;
}
}
2.4 调用工厂函数
int main()
{
OperationFactory factory;
Operation* oper = factory.CreateOperate('*');
oper->SetNumberA(3.0);
oper->SetNumberB(4.0);
double res = oper->GetResult();
std::cout << "result: " << res << std::endl;
factory.DeleteOperate();
return 0;
}
以上。



