【UE4 设计模式】单例模式 Singleton Pattern
2024-10-19 13:31:06
概述
描述
- 保证一个类只有一个实例
- 提供一个访问该实例的全局节点,可以视为一个全局变量
- 仅在首次请求单例对象时对其进行初始化。
套路
- 将默认构造函数设为私有, 防止其他对象使用单例类的
new
运算符。 - 新建一个静态构建方法作为构造函数。
使用场景
- 资源Manager,如 SoundManager、ParticeManager 等
- 线程池
- 多线程的单例模式,线程锁与双重检测
优缺点
- 优点
- 提供了对唯一实例的受控访问;
- 由于内存只存在一个对象,因此可节约资源
- 单例模式可以允许可变的数目的实例,使用单利模式进行扩展,使用控制单利对象相似的方法获取指定个数的实例,及解决了单利对象,共享过多,而有损性能的问题;
- 缺点
- 由于单例模式不是抽象的,所以可扩展性比较差;
- 单例职责过重,在一定程度上违背了单一职责。(耦合性高)
UE4中的单例
GameInstance
- 继承 GameInstance 创建类
- Project Settings->Project->Game Instance -> Game Instance Class 设置为自定义类
Subsystem
- 包括五类:
- UEngineSubsystem
- UEditorSubsystem
- UGameInstanceSubsystem
- UWorldSubsystem
- ULocalPlayerSubsystem
自定义 Singleton Class
继承 UObject 自定义
代码
UCLASS(BlueprintType,Blueprintable)
class DESIGNPATTERNS_API USingletonObject : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
static USingletonObject* GetSingletonObjectIns(); UFUNCTION(BlueprintCallable)
void SetValue(int32 NewValue); UFUNCTION(BlueprintCallable)
int32 GetValue(); private:
static USingletonObject* SingletonObject; int32 IntValue;
};
USingletonObject* USingletonObject::SingletonObject = nullptr; USingletonObject* USingletonObject::GetSingletonObjectIns()
{
if (SingletonObject == nullptr)
{
SingletonObject = NewObject<USingletonObject>();
}
return SingletonObject;
} void USingletonObject::SetValue(int32 NewValue)
{
IntValue = NewValue;
} int32 USingletonObject::GetValue()
{
UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" Value = %d"), IntValue);
return IntValue;
}
Game Singleton Class 指定
继承 UObject 创建单例类
Project Settings->Engine->General settings->Game Singleton Class 设置为自定义的单例类。会自动生成与销毁
单例类代码,修改
USingletonObject* USingletonObject::GetSingletonObjectIns()
{
if (SingletonObject == nullptr) // 也可以判断 GEngine
{
SingletonObject = Cast<USingletonObject>(GEngine->GameSingleton);
}
return SingletonObject;
}
参考
最新文章
- 【FLUENT案例】04:利用DDPM+DEM模拟鼓泡流化床
- Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)
- HDFS中JAVA API的使用
- js:方法1. 数组
- ASP.NET中数据邦定效率问题的一点看法 - 转载(自由的天空)
- 移动API-restful的设计原则和参考
- ref游标(动态游标)
- 【rails3教材】博客构建过程
- tomcat生成ssl证书
- bootstrap兼容IE
- JavaScript- The Good Parts Chapter 3 Objects
- 5.android系统裁剪
- 关于升级linux下apache
- RasterBandClass Class
- Polipo
- iPhone safari中Document事件不触发的解决方案 [冒泡]
- 前端自动化测试python+webdriver
- 蚂蚁代理免费代理ip爬取(端口图片显示+token检查)
- centos如何设置固定IP
- oracle竖表转横表字段合并