简单工厂模式

目录

适用场景

使用

UML类图

代码实现

优点

缺点

适用场景

  • 对同样的数据不确定有多少种不同的逻辑处理
  • 可能会增加新的逻辑处理

使用

计算器

  • 计算器不但有简单的加、减、乘、除运算,也有平方、立方、指数等较为复杂的运算。
  • 因此可以抽象出一个运算类,提供统一接口
  • 根据不同的操作创建不同的运算子类
  • 通过将运算符提供给工厂类选择具体的实现类

UML类图

代码实现

运算类

class Ope
{
public:
	Ope();
	~Ope();

public:
	double GetNums1() { return m_nums1; }
	double GetNUms2() { return m_nums2; }
	void SetNums1(double num) { m_nums1 = num; };
	void SetNums2(double num) { m_nums2 = num; };
	virtual double GetRes() { double res = 0; return res; };

private:
	double m_nums1;
	double m_nums2;

};

运算子类

class Add :public Ope
{
public:
	double GetRes()
	{
		return GetNums1() + GetNUms2();
	};
};

class Sub :public Ope
{

public:
	double GetRes()
	{
		return GetNums1() - GetNUms2();
	}
};

class Mul :public Ope
{
public:
	double GetRes()
	{
		return GetNums1() * GetNUms2();
	}
};

class Div :public Ope
{
public:
	double GetRes()
	{
		if (!GetNUms2())
		{

			std::cout << "div is 0" << std::endl;
			return 0;
		}

		return GetNums1() / GetNUms2();
	}
};

工厂类

class OpeFactory
{
public:
	Ope * createOpe(Oper ope) 
	{
		Ope * oper = NULL;
		switch (ope)
		{
		case Oper_Add:
			oper = new Add();
			break;
		case Oper_Sub:
			oper = new Sub();
			break;
		case Oper_Mul:
			oper = new Mul();
			break;
		case Oper_Div:
			oper = new Div();
			break;
		default:
			break;
		}
		return oper;
	}

};
int main()
{
	OpeFactory * opeFct = new OpeFactory();
	Ope * oper;
	oper = opeFct->createOpe(Oper_Add);
	oper->SetNums1(1);
	oper->SetNums2(2);
	double rst = oper->GetRes();
	std::cout << rst << std::endl;
	return 0;
}

优点

  • 低耦合,可扩展性强
  • 类内部可以自由修改
  • 具有清晰的对外接口

缺点

具有多个运算子类的时候,工厂类的逻辑分支较多,处理复杂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值