一、概念
工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
二、简单工厂 VS 工厂方法
简单工厂的缺点:https://blog.csdn.net/yaodaoji/article/details/116920172
我们还是以计算器为例来分析,现在已经有了加减乘除运算,现在我们还想再加一个开根号运算,此时,我们需要在工厂类的case中再添加分支。我们修改了原来的类,这就违背了“开放 - 封闭原则”。所以这种模式不好。因此,为了避免这种缺点。我们又写了工厂方法模式。
三、代码
class Operation
{
public:
double num_A = 0;
double num_B = 0;
virtual double Result() {
double result = 0;
cout << "I'm Operation::Result();result = " << result << endl;
return result;
}
};
class Add : public Operation
{
public:
double Result()
{
double result = 0;
result = num_A + num_B;
cout << "I'm Add::Result()" << endl;
return result;
}
};
class Sub : public Operation
{
public:
double Result()
{
double result = 0;
result = num_A - num_B;
cout << "I'm Sub::Result()" << endl;
return result;
}
};
class Mul : public Operation
{
public:
double Result()
{
double result = 0;
result = num_A * num_B;
cout << "I'm Mul::Result()" << endl;
return result;
}
};
class Div : public Operation
{
public:
double Result()
{
double result = 0;
if (0 == num_B)
{
cout << "除数为0" << endl;
return -1;
}
else {
result = num_A / num_B;
}
cout << "I'm Add::Result()" << endl;
return result;
}
};
/*----------------工厂方法模式-------------------------*/
class IFactory
{
virtual Operation * createOperation() = 0;
};
class AddFactory : public IFactory
{
public:
static Operation *createOperation()
{
return new Add();
}
};
class SubFactory : public IFactory
{
public:
static Operation *createOperation()
{
return new Sub();
}
};
class MulFactory : public IFactory
{
public:
static Operation *createOperation()
{
return new Mul();
}
};
class DivFactory : public IFactory
{
public:
static Operation *createOperation()
{
return new Div();
}
};
/*----------------工厂方法模式-------------------------*/
客户端代码:
int main()
{
Operation *oper = MulFactory::createOperation();
oper->num_A = 9;
oper->num_B = 99;
cout << oper->Result() << endl;
}
打印结果: