【UE4 C++】抽象工厂模式 Abstract Factory Pattern
2021/6/5 12:21:06
本文主要是介绍【UE4 C++】抽象工厂模式 Abstract Factory Pattern,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
概述
描述
-
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例
-
抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone、iPad);
工厂方法每个工厂只能创建一种
套路
- 创建抽象产品族类 ,定义抽象产品的公共接口;
- 创建抽象产品类 ,继承抽象产品族类;(此处可理解为相对具体得产品族类)
- 创建具体产品类,继承抽象产品类;
- 创建抽象工厂类
- 创建工厂类,继承抽象工厂类,定义具体产品类的创建方法;
- 通过调用具体工厂类的方法,从而创建不同具体产品类的实例
使用场景
- 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
- 系统中有多个产品族,每次只使用其中某一产品族。
- 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
- 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
- 举例
- 敌人生成,不同区域地点可以利用不同工厂生成不同敌人,
- 游戏难度,不同难度可以产生不同类型的建筑、英雄以及技能。
- AI 战术选择。实现确定好几种可选战术作为产品族,每种战术按照类似海军、空军、陆军作为产品等级结构选择具体兵种进行生产建造。
- 多语言。用户改变语言环境时,会改变响应的文字显示,音效,图片显示,操作习惯适配等。
- 皮肤更换或者资源管理。用户选择不同主题的皮肤将会影响图片显示以及动画效果。
- 屏幕适配。对高、中、低分辨率的移动设备使用不同的显示资源。
优缺点
- 优点
- 隔离了具体类的生成,使得调用者不需要知道什么被创建。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。实现了高内聚低耦合
- 所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
- 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
- 缺点
- 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
- 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)。
UE4 实践
-
做一个简单得怪物生成器,在不死族地带生成不死族怪物,在哥布林地带生成哥布林怪物;怪物分别有士兵和弓箭手两种
-
创建抽象产品族类、抽象产品类——怪物、怪物士兵、怪物弓箭手
// 抽象产品族类 —— 怪物 UCLASS(Abstract) class DESIGNPATTERNS_API UMonster : public UObject { GENERATED_BODY() public: virtual void ShowInfo() { check(0 && "You must override this"); } }; // 抽象产品类、具体产品族 —— 怪物士兵 UCLASS(Blueprintable, BlueprintType) class DESIGNPATTERNS_API UMonsterSoldier : public UMonster { GENERATED_BODY() public: virtual void ShowInfo() override { UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" This is a Monster Soldier")); } }; // 抽象产品类、具体产品族 —— 怪物弓箭手 UCLASS(Blueprintable, BlueprintType) class DESIGNPATTERNS_API UMonsterArcher : public UMonster { GENERATED_BODY() public: virtual void ShowInfo() override { UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" This is a Monster Archer")); } };
-
创建具体产品类——骷髅士兵、骷髅弓箭手、哥布林士兵、哥布林弓箭手
// 具体产品类 —— 怪物士兵 —— 骷髅士兵 UCLASS(Blueprintable, BlueprintType) class DESIGNPATTERNS_API UUndeadSkeletonSoldier : public UMonsterSoldier { GENERATED_BODY() public: virtual void ShowInfo() override { UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" This is a Undead Skeleton Soldier")); } }; // 具体产品类 —— 怪物士兵 —— 哥布林士兵 UCLASS(Blueprintable, BlueprintType) class DESIGNPATTERNS_API UGoblinSoldier : public UMonsterSoldier { GENERATED_BODY() public: virtual void ShowInfo() override { UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" This is a Goblin Soldier")); } }; // 具体产品类 —— 怪物弓箭手 —— 骷髅弓箭手 UCLASS(Blueprintable, BlueprintType) class DESIGNPATTERNS_API UUndeadSkeletonArcher : public UMonsterArcher { GENERATED_BODY() public: virtual void ShowInfo() override { UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" This is a Undead Skeleton Archer")); } }; // 具体产品类 —— 怪物弓箭手 —— 哥布林弓箭手 UCLASS(Blueprintable, BlueprintType) class DESIGNPATTERNS_API UGoblinArcher : public UMonsterArcher { GENERATED_BODY() public: virtual void ShowInfo() override { UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" This is a Goblin Archer")); } };
-
创建抽象工厂类、具体工厂类——怪物生成器、不死族怪物生成器、哥布林怪物生成器
// 抽象工厂类 —— 怪物生成器 UCLASS(Abstract) class DESIGNPATTERNS_API UMonsterFactory : public UObject { GENERATED_BODY() public: // 生成士兵 virtual UMonsterSoldier* CreateMonsterSoldier() { check(0 && "You must override this"); return nullptr; } // 生成弓箭手 virtual UMonsterArcher* CreateMonsterArcher(){ check(0 && "You must override this"); return nullptr; } }; // 具体工厂类 —— 不死族怪物生成器 UCLASS(Blueprintable, BlueprintType) class DESIGNPATTERNS_API UUndeadMonsterFactory : public UMonsterFactory { GENERATED_BODY() public: // 生成骷髅士兵 virtual UMonsterSoldier* CreateMonsterSoldier() override { return NewObject<UUndeadSkeletonSoldier>(); // 实际使用 SpawnActor } // 生成骷髅弓箭手 virtual UMonsterArcher* CreateMonsterArcher() override { return NewObject<UUndeadSkeletonArcher>(); } }; // 具体工厂类 —— 哥布林怪物生成器 UCLASS(Blueprintable, BlueprintType) class DESIGNPATTERNS_API UGoblinMonsterFactory : public UMonsterFactory { GENERATED_BODY() public: // 生成哥布林士兵 virtual UMonsterSoldier* CreateMonsterSoldier() override { return NewObject<UGoblinSoldier>(); // 实际使用 SpawnActor } // 生成哥布林弓箭手 virtual UMonsterArcher* CreateMonsterArcher() override { return NewObject<UGoblinArcher>(); } };
-
测试调用
// 调用测试用的Actor UCLASS() class DESIGNPATTERNS_API AMonsterGenerator : public AActor { GENERATED_BODY() public: void BeginPlay() override { // 不死族地带区域 生成怪物 UUndeadMonsterFactory* UndeadMonsterFactory = NewObject<UUndeadMonsterFactory>(); UndeadMonsterFactory->CreateMonsterSoldier()->ShowInfo(); UndeadMonsterFactory->CreateMonsterArcher()->ShowInfo(); // 哥布林地带生成 怪物 UGoblinMonsterFactory* GoblinMonsterFactory = NewObject<UGoblinMonsterFactory>(); GoblinMonsterFactory->CreateMonsterSoldier()->ShowInfo(); GoblinMonsterFactory->CreateMonsterArcher()->ShowInfo(); } };
-
调式输出
LogTemp: Warning: UUndeadSkeletonSoldier::ShowInfo This is a Undead Skeleton Soldier LogTemp: Warning: UUndeadSkeletonArcher::ShowInfo This is a Undead Skeleton Archer LogTemp: Warning: UGoblinSoldier::ShowInfo This is a Goblin Soldier LogTemp: Warning: UGoblinArcher::ShowInfo This is a Goblin Archer
参考
- 抽象工厂模式(Abstract Factory)
- [抽象工厂模式]在游戏开发中的应用
这篇关于【UE4 C++】抽象工厂模式 Abstract Factory Pattern的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升