策略模式+简单工厂

🍇工厂模式
🍈工厂模式向策略模式过度------工厂加一个保安
🍏策略模式
🍐策略模式+简单工厂

声明本文需要理解多态的基础上才能来学习
欢迎前来学习------继承和多态
学习记录

工厂模式

需要什么就生成什么

cpp 复制代码
// 工厂模式
class Factory
{
	// 这个是工厂
public:
	Factory()
	{
		puts("Factory");
	}
	//virtual void func() = 0;// 不能使用纯虚函数,使用纯虚函数就不能在工厂中创建对象
	// virtual void func();// 也不能只声明不定义
	virtual void func()
	{}
};
class FactoryA :public Factory
{
public:
	FactoryA()
	{
		puts("FactoryaA");
	}
	void func()
	{
		puts("funcA");
	}
};
class FactoryB :public Factory
{
public:
	FactoryB()
	{
		puts("FactoryB");
	}
	void func()
	{
		puts("funcB");
	}
};

int main()
{
	FactoryA a;
	a.func();
	FactoryB b;
	b.func();

	return 0;
}

问: 看了代码上面的内容之后,我就想问,都要写3个类了,为什么不直接实现成3个毫无关系的类呢,为什么要实现成多态的形式,多麻烦呀

答: 话是这么说没错,但是,让他们没有联系,如果有100个类,他们需要进行改动,需要添加一个函数,那么就需要改动100次;而如果使用继承,就可以大大减少工作量

工厂模式向策略模式过度------工厂加一个保安

cpp 复制代码
class Factory
{
	// 这个是工厂
public:
	Factory()
	{
		puts("Factory");
	}
	//virtual void func() = 0;// 不能使用纯虚函数,使用纯虚函数就不能在工厂中创建对象
	// virtual void func();// 也不能只声明不定义
	virtual void func()
	{}
};
class FactoryA :public Factory
{
public:
	FactoryA()
	{
		puts("FactoryaA");
	}
	void func()
	{
		puts("funcA");
	}
};
class FactoryB :public Factory
{
public:
	FactoryB()
	{
		puts("FactoryB");
	}
	void func()
	{
		puts("funcB");
	}
};
class Context
{
	// 这个是将产品给他管理
public:
	Context()
	{
		puts("Context");
	}
	// 这里需要实现多态,不同的产品有不同的行为
	Context(Factory* tem)
	{
		s = tem;
		puts("Context");
	}
	void Interface()
	{
		s->func();
	}
	Factory* s;
};

好处就在于使用者就可以忽略多态这个特性直接向平常的函数一样使用就可以了

策略模式

策略模式:在用户使用的时候手动进行判断,判断需要使用哪个产品进行生产

策略模式+简单工厂

策略模式+工厂模式就是为了解决需要手动判断的问题------降低使用难度,简化使用步骤

具体实现就是将判断的逻辑放到Context内部

cpp 复制代码
#include<iostream>
using namespace std;

// 策略模式+工厂模式
class Strategy
{
	// 这个是工厂
public:
	Strategy()
	{
		puts("Strategy");
	}
	//virtual void func() = 0;// 不能使用纯虚函数,使用纯虚函数就不能在工厂中创建对象
	// virtual void func();// 也不能只声明不定义
	virtual void func()
	{}
};
class StrategyA :public Strategy
{
public:
	StrategyA()
	{
		puts("StrategyA");
	}
	void func()
	{
		puts("funcA");
	}
};
class StrategyB :public Strategy
{
public:
	StrategyB()
	{
		puts("StrategyB");
	}
	void func()
	{
		puts("funcB");
	}
};
class Context
{
	// 这个是将产品给他管理
public:
	Context()
	{
		puts("Context");
	}
	// 这里需要实现多态,不同的产品有不同的行为
	//Context(Strategy* tem)
	//{
	//	s = tem;
	//	puts("Context");
	//}
	Context(int t)
	{
		switch (t)
		{
		case 0:
			s = new StrategyA;
			break;
		case 1:
			s = new StrategyB;
			break;
		}
	}
	void Interface()
	{
		s->func();
	}
	Strategy* s;
};

int main()
{
	Context con(1);
	con.Interface();

	return 0;
}

这种方式能让代码更美观

相关推荐
D_evil__3 小时前
【Effective Modern C++】第五章 右值引用、移动语义和完美转发:24. 区分万能引用和右值引用
c++
蜡笔小马3 小时前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
林开落L4 小时前
从零开始学习Protobuf(C++实战版)
开发语言·c++·学习·protobuffer·结构化数据序列化机制
林开落L4 小时前
从入门到了解:Protobuf、JSON、XML 核心解析(C++ 示例)
xml·c++·json·protobuffer·结构化数据序列化机制
Queenie_Charlie4 小时前
stars(树状数组)
数据结构·c++·树状数组
会周易的程序员4 小时前
openplc runtimev4 Docker 部署
运维·c++·物联网·docker·容器·软件工程·iot
爱装代码的小瓶子4 小时前
【C++与Linux基础】进程间通讯方式:匿名管道
android·c++·后端
CoderCodingNo4 小时前
【GESP】C++ 二级真题解析,[2025年12月]第一题环保能量球
开发语言·c++·算法
LYOBOYI1234 小时前
qtcpSocket详解
c++·qt
REDcker4 小时前
gRPC完整文档
服务器·网络·c++·网络协议·grpc