【设计模式】从游戏角度开始了解设计模式 --- 抽象工厂模式


永远记住,你的存在是有意义的,
你很重要,
你是被爱着的,
而且你为这个世界带来了无可取代的东西。
-- 麦克西 《男孩、鼹鼠、狐狸和马》--


从零开始了解设计模式

抽象工厂模式

今天我们一起来探究抽象工厂模式,这是对工厂模式的进阶实现。通常我们将工厂模式与抽象工厂模式比作一维数组与二维数组。

工厂模式我们可以创建出一种类别的实例,而如果我们此时这种类别存在若干个变种,这时就可以通过抽象工厂模式进行创建。

比如现在正在制作一块魔幻rpg类型游戏,每个角色都有武器与防具两种装备。武器存在大剑,法杖,拳套等,防具有护盾,魔法书,披风等。对于这个背景,就有两个维度。为了实现这个功能可以如下设计:

cpp 复制代码
#include<iostream>

using namespace std;
//装备基类
class Weapon {
public:
	virtual void use() = 0;
};
//防具基类
class Armour {
public:
	virtual void equip() = 0;
};

//大剑
class Sword : public Weapon{
public:
	void use() {
		cout << "use sword" << endl;
	}
};
//法杖
class Staff : public Weapon {
public:
	void use() {
		cout << "use staff" << endl;
	}
};

//护盾
class Shield : public Armour {
public:
	void equip() override {
		cout << "equip shield" << endl;
	}
};
//斗篷
class Cloak : public Armour {
public:
	void equip() {
		cout << "equip cloak" << endl;
	}
};

//角色装备工厂
class EquipmentFactory {
public:
	virtual Weapon* createWeapon() = 0;
	virtual Armour* createArmour() = 0;
};

class WarriorFactory : public EquipmentFactory {
public:
	Weapon* createWeapon() override{
		return new Sword();
	}

	Armour* createArmour() override {
		return new Shield();
	}

};

class MageFactory : public EquipmentFactory {
public:
	Weapon* createWeapon() override {
		return new Staff();
	}

	Armour* createArmour() override {
		return new Cloak();
	}
};



class Character {
public:
	Character(EquipmentFactory* factory) :_factory(factory),
											weapon(nullptr),
											armour(nullptr) {}
	//角色展现出来的装备特性
	void equip() {
		weapon = _factory->createWeapon();
		armour = _factory->createArmour();

		//调用装备使用方法
		weapon->use();
		armour->equip();
	}

private:
	EquipmentFactory* _factory;
	Weapon* weapon = nullptr;
	Armour* armour = nullptr;
};



int main() {
	//创建战士
	EquipmentFactory* warriorFactory = new WarriorFactory();
	Character warrior(warriorFactory);
	warrior.equip();

	EquipmentFactory* mageFactory = new MageFactory();
	Character mage(mageFactory);
	mage.equip();

	return 0;

}

根据这个例子,我们可以总结一下抽象工厂的要素:

  1. 抽象产品:如weapon与Armour基类,约定了具体产品的接口声明,限制他们必须具有的功能
  2. 具体产品:如sword,staff ,shield类,这是实际发挥作用的产品,是最终被抽象工厂实例化的对象
  3. 抽象工厂:负责声明一组接口,来创建抽象产品。
  4. 具体工厂:具体工厂负责实例化具体产品。

抽象工厂模式通常在以下场景中使用:

  1. 跨平台GUI框架:qt, GTK+,wxWidgets对平台的不同组件进行封装
  2. 游戏引擎文件系统:不同操作系统上的文件操作api是不同的,当针对不同平台进行导出发布时,游戏引擎底层帮助我们完成了对不同平台文件读写的屏蔽与兼容。文件系统内部的writer与Reader读写器,就可以通过抽象工厂创建
  3. 游戏界面风格主题:针对不同主题实现不同UI组件的灵活切换。当版本更新或者活动上线时,可能需要对已有的界面组件在功能保持不变的情况下,对配色布局进行替换。这就需要我们通过抽象层来讲它与客户端代码解耦。
  4. 跨平台网络库:游戏引擎需要对不同系统的网络接口提供抽象与兼容。

再来看抽象工厂的优缺点

  • 优点:更多维度的可定制化,可以针对不同的产品变种提供具体的创建逻辑。
  • 缺点:更多的类,代码更多,抽象和理解的过程更加复杂。
  • 抽象工厂下的产品通常是协同工作的!
相关推荐
初圣魔门首席弟子6 分钟前
c++中this指针使用bug
前端·c++·bug
K 旺仔小馒头16 分钟前
《牛刀小试!C++ string类核心接口实战编程题集》
c++·算法
草莓熊Lotso1 小时前
《吃透 C++ vector:从基础使用到核心接口实战指南》
开发语言·c++·算法
大飞pkz5 小时前
【设计模式】责任链模式
开发语言·设计模式·c#·责任链模式
大飞pkz7 小时前
【设计模式】六大基本原则
开发语言·设计模式·c#·六大原则
2401_841495649 小时前
【数据结构】红黑树的基本操作
java·数据结构·c++·python·算法·红黑树·二叉搜索树
liu****9 小时前
负载均衡式的在线OJ项目编写(六)
运维·c++·负载均衡·个人开发
雪下的新火10 小时前
Unity+Blender-03-输出制作Flipbook
游戏·unity·游戏引擎·blender·资源·笔记分享
青草地溪水旁10 小时前
设计模式(C++)详解——迭代器模式(3)
c++·设计模式·迭代器模式
奔跑吧邓邓子10 小时前
【C++实战㊺】解锁C++代理模式:从理论到实战的深度剖析
c++·实战·代理模式