策略模式+简单工厂

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

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

工厂模式

在这里插入图片描述
需要什么就生成什么

// 工厂模式
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次;而如果使用继承,就可以大大减少工作量

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

在这里插入图片描述

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内部
在这里插入图片描述

#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;
}

这种方式能让代码更美观

相关推荐

  1. 简单工厂工厂方法、抽象工厂策略模式

    2024-06-11 03:58:01       56 阅读
  2. 工厂模式+策略模式

    2024-06-11 03:58:01       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-11 03:58:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-11 03:58:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-11 03:58:01       82 阅读
  4. Python语言-面向对象

    2024-06-11 03:58:01       91 阅读

热门阅读

  1. 算法训练营day52

    2024-06-11 03:58:01       29 阅读
  2. ABSD-系统架构师(七)

    2024-06-11 03:58:01       31 阅读
  3. document.queryselector怎么用

    2024-06-11 03:58:01       42 阅读
  4. Centos7.9部署单节点K8S环境

    2024-06-11 03:58:01       28 阅读
  5. leetcode 40. 组合总和 II

    2024-06-11 03:58:01       46 阅读
  6. Cordova WebView重定向到网站

    2024-06-11 03:58:01       46 阅读
  7. 重写setter方法要小心递归调用

    2024-06-11 03:58:01       22 阅读
  8. 代码随想录打卡第一天(补)

    2024-06-11 03:58:01       31 阅读
  9. web3规则改变者:Linea的厉害之处

    2024-06-11 03:58:01       33 阅读
  10. 什么是 prop drilling,如何避免?

    2024-06-11 03:58:01       26 阅读