版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/i_chaoren/article/details/80634438
介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些。因为它至少不是Gof23种设计模式之一。但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导。
动机:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
定义:简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
优缺点
优点:实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责。
缺点:工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。
使用场合:工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
举例如下:
对于一个只拥有加减乘除运算的简单计算器,我们设计一个Operation的父类,并构造加减乘除四个类继承父类重写运算函数
GetResult。然后定义工厂类中的工厂函数,其根据用户的输入new出相应的对象实例并返回其父类的指针。
UML图如下所示:
注意智能指针的使用,可以防止资源泄露
#include<iostream>
#include<memory>
using namespace std;
class Operation
{
private:
double n1, n2;
public:
double GetN1() const { return n1; }
double GetN2() const { return n2; }
void SetN1(double x) { n1 = x; }
void SetN2(double y) { n2 = y; }
virtual double GetResult() = 0;
};
class Add : public Operation {
public:
double GetResult() override {
return GetN1() + GetN2();
}
};
class Sub : public Operation {
public:
double GetResult() override {
return GetN1() - GetN2();
}
};
class Mul : public Operation
{
public:
double GetResult() override {
return GetN1()*GetN2();
}
};
class Div : public Operation
{
public:
double GetResult() override {
return GetN1() / GetN2();
}
};
class SimpleFactory
{
public:
static Operation* CreateOpeartor(char ch) {
Operation * p;
switch (ch) {
case '+':
p = new Add();
break;
case '-':
p = new Sub();
break;
case '*':
p = new Mul();
break;
case '/':
p = new Div();
break;
default:
p = nullptr;
}
return p;
}
};
int main() {
double a = 0;
double b = 0;
char ch = '\0';
cin >> a >> ch >> b;
//使用智能指针,防止资源泄露
shared_ptr<Operation> op(SimpleFactory::CreateOpeartor(ch));
op->SetN1(a);
op->SetN2(b);
cout << op->GetResult() << endl;
}
参考:
1.https://www.cnblogs.com/jostree/p/4251756.html
2.https://www.cnblogs.com/Bobby0322/p/4178412.html