欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简单工厂模式

程序员文章站 2024-03-14 21:22:11
...

简单工厂模式

简介

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式。实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

包含的角色

简单工厂模式包含三个角色:

(1)工厂类Factory:工厂类是用来制造产品的。因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类的函数。这个函数能够根据“标识符”的不同生成不同的ConcreteProduct,当然这些ConcreteProduct都是继承自AbstractProduct的。

(2)抽象产品类AbstractProduct:抽象产品是从其他具体产品抽象出来的。抽象产品类只有一个。

(3)具体产品类ConcreteProduct:具体产品类继承自抽象产品类,可以有多个。当需要增加新的产品的时候就增加一个继承自抽象产品类的具体产品类即可。

优势:

实现了松耦合,当需要增加一种新产品(在大话设计模式中,例子是 运算Operation),只需要做两点改动:

(1)增加一个继承自抽象产品(抽象的运算)的具体产品(一种具体的运算);

(2)在工厂类中,switch中,增加一种根据标识符产生新运算的case即可。

代码示例:

#include <iostream>
#include <memory>
using namespace std;
//抽象类
class Operation
{
private:
	double A, B;
public:
	double GetA() const { return A; }
	double GetB() const { return B; }
	void SetA(double x) { A = x; }
	void SetB(double y) { B = y; }
	double virtual GetResult() { return 0; }
	Operation() :A(0), B(0) {}
};
//具体类
class Add : public Operation
{
public:
	double GetResult()
	{
		return GetA() + GetB();
	}
};

class Sub : public Operation
{
public:
	double GetResult()
	{
		return GetA() - GetB();
	}
};

class Mul : public Operation
{
public:
	double GetResult()
	{
		return GetA()*GetB();
	}
};

class Div : public Operation
{
public:
	double GetResult()
	{
		return GetA() / GetB();
	}
};

//工厂类
class SimpleFactory
{
public:
	static Operation * CreateOpeartor(char ch)
	{
		Operation * p=NULL;
		switch (ch)
		{
		case '+':
			p = new Add();
			break;
		case '-':
			p = new Sub();
			break;
		case '*':
			p = new Mul();
			break;
		case '/':
			p = new Div();
			break;
		}
		return p;
	}
};
//客户做的事情
int main(int argc, char* argv[])
{
	double A = 0;
	double B = 0;
	char ch = '\0';
	cin >> A >> ch >> B;
	tr1::shared_ptr<Operation> op(SimpleFactory::CreateOpeartor(ch));
	op->SetA(A);
	op->SetB(B);
	cout << op->GetResult() << endl;
	system("pause");
	return 0;
}


简单工厂模式

结构图

简单工厂模式