栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【笔记】大话设计模式-1简单工厂模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【笔记】大话设计模式-1简单工厂模式

【笔记】大话设计模式-1简单工厂模式

文章目录
  • 【笔记】大话设计模式-1简单工厂模式
    • 1 简介
    • 2 代码
      • 2.1 定义基类
      • 2.2 创建派生类对象,这里以加减乘除为例
      • 2.3 创建工厂
      • 2.4 调用工厂函数

1 简介

说白了,就是考虑用一个单独的类来做创造实例的过程,这就是工厂。

工厂就是实例化出合适的对象,通过多态,返回基类的方式。

举个例子,我想买一双鞋,一般情况下,我要去各个品牌店去买对应的鞋子,太麻烦了,现在,我直接去一家工厂,告诉工厂我要一双"王五"牌鞋子,工厂就直接给你了,这就是工厂方便的地方。将你所需要的实例直接给你。

好处:将来新增派生类的时候,对外提供的接口函数可以保持不变,只需新增派生类,并改变工厂的入参即可。

2 代码 2.1 定义基类

创建一个操作的基类,操作两个数,得到一个结果

// 基类
class Operation
{
public:
	Operation() {};
	~Operation() {};
	inline double GetNumberA()
	{
		return numberA;
	}

	inline void SetNumberA(double a)
	{
		numberA = a;
	}

	inline double GetNumberB()
	{
		return numberB;
	}

	inline void SetNumberB(double b)
	{
		numberB = b;
	}

	virtual double GetResult()
	{
		double result = 0.0;
		return result;
	}

private:
	double numberA{ 0.0 };
	double numberB{ 0.0 };
};
2.2 创建派生类对象,这里以加减乘除为例
// 加法
class OperationAdd : public Operation
{
	double GetResult() override;	
};

double OperationAdd::GetResult()
{
	double result = GetNumberA() + GetNumberB();
	return result;
};

// 减法
class OperationSub : public Operation
{
	double GetResult() override;
};

double OperationSub::GetResult()
{
	double result = GetNumberA() - GetNumberB();
	return result;
}

// 乘法
class OperationMul : public Operation
{
	double GetResult() override;
};

double OperationMul::GetResult()
{
	double result = GetNumberA() * GetNumberB();
	return result;
}

// 除法
class OperationDiv : public Operation
{
	double GetResult() override;
};

double OperationDiv::GetResult()
{
	if (fabs(GetNumberB() - 0.0) < 1e-10) {
		std::cout << "The divisor can not be 0!" << std::endl;
		return 0.0;
	}
	double result = GetNumberA() / GetNumberB();
	return result;
}
2.3 创建工厂
// ========= 工厂函数 =========
class OperationFactory
{
public:
	OperationFactory();
	~OperationFactory();
	Operation* CreateOperate(char operate);
	void DeleteOperate();
private:
	Operation* oper;
};

OperationFactory::OperationFactory()
{
	oper = nullptr;
}

OperationFactory::~OperationFactory()
{
}


Operation* OperationFactory::CreateOperate(char operate)
{
	switch (operate)
	{
	case '+':
		oper = new OperationAdd();
		break;
	case '-':
		oper = new OperationSub();
		break;
	case '*':
		oper = new OperationMul();
		break;
	case '/':
		oper = new OperationDiv();
		break;
	default:
		oper = new OperationAdd();
		break;
	}
	return oper;
}

void OperationFactory::DeleteOperate()
{
	if (oper != nullptr){
		delete oper;
	}
}
2.4 调用工厂函数
int main()
{
	OperationFactory factory;
	Operation* oper = factory.CreateOperate('*');
	oper->SetNumberA(3.0);
	oper->SetNumberB(4.0);
	double res = oper->GetResult();
    std::cout << "result: " << res << std::endl;
	factory.DeleteOperate();
	return 0;
}


以上。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917072.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号