This article contains 444 words.
单例模式
- 类只能有一个实例
- 必须自行创建这个实例,自己创建自己的唯一实例
- 必须自行向整个系统提供这个实例
为什么用单例
单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点。使用单例模式可以节省资源,避免频繁创建和销毁对象,特别适用于需要频繁访问的资源密集型对象。
如何实现单例
以下是实现单例模式的步骤和示例代码:
新建UObject
- 新建一个C++文件,继承自UObject。
- 新建一个Actor用于测试能否正确调用该单例。
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
#pragma once
#include "CoreMinimal.h" #include "UObject/NoExportTypes.h" #include "MySingleton.generated.h"
UCLASS(Blueprintable) class MYPROJECT_API UMySingleton : public UObject { GENERATED_BODY()
public: UMySingleton();
UFUNCTION(BlueprintCallable, Category = "Singleton") static UMySingleton* GetInstance();
UFUNCTION(BlueprintCallable, Category = "Singleton") void TestCall();
private: static UMySingleton* SingletonInstance; };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
#include "MySingleton.h"
UMySingleton* UMySingleton::SingletonInstance = nullptr;
UMySingleton::UMySingleton() { }
UMySingleton* UMySingleton::GetInstance() { if (SingletonInstance == nullptr) { SingletonInstance = NewObject<UMySingleton>(); SingletonInstance->AddToRoot(); } return SingletonInstance; }
void UMySingleton::TestCall() { UE_LOG(LogTemp, Warning, TEXT("TestCall")); }
|
添加到GameInstance
1 2 3 4 5 6 7 8 9 10 11 12 13
|
private: UPROPERTY(BlueprintCallable) class UMysingleton* GlobalSingleton;
void UMyGameInstance::Init() { Super::Init(); GlobalSingleton = UMysingleton::GetInstance(); }
|
优点
- 保证一个类只有一个实例
- 提供一个全局访问点
- 节省资源,避免频繁创建和销毁对象
- 适用于需要频繁访问的资源密集型对象