Simple Factory Pattern--简单工厂模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/i_chaoren/article/details/80634438
今日推荐