UE4 C++设计模式:单例模式(Singleton Pattern)

目录

描述

套路

使用场景

优缺点

UE4中的单例模式

GameInstance

SubSystem

自定义Singleton Class

Game Singleton Class指定


描述

  • 保证一个类只有一个实例
  • 提供一个访问该实例的全局节点,可以视为一个全局变量
  • 仅在首次请求单例对象时对其进行初始化

套路

  • 将默认构造函数设为私有,防止其他对象使用单例类的new运算符
  • 新建一个静态构建方法作为构造函数

使用场景

  • 资源Manager,如SoundManager、ParticleManager
  • 线程池
  • 多线程的单例模式,线程锁与双重检测

优缺点

  • 优点
    • 提供了对唯一实例的受控访问
    • 由于内存只存在一个对象,因此可节约资源
    • 单例模式可以允许可变的数目的实例,使用单例模式进行扩展,使用控制单例对象相似的方法获取指定个数的实例,解决单例对象共享过多从而有损性能的问题
  • 缺点
    • 由于单例模式不是抽象的,所以可扩展性比较差
    • 单例职责过重,在一定程度上违背了单一职责(耦合性高)

UE4中的单例模式

GameInstance

  • 继承GameInstance创建类
  • Project Settings->Project->Game Instance -> Game Instance Class 设置为自定义类

SubSystem

自定义Singleton Class

UCLASS(BlueprintType,Blueprintable)
class DESIGNPATTERNS_API USingletonObject:public UObject{
	GENERATED_BODY()
public:
	UFUNCTION(BlueprintCallable)
	static USingletonObject* GetSinletonObjectIns();
	
	UFUNCTION(BlueprintCallable)
	void SetValue(int32 NewValue);
	
	UFUNCTION(BlueprintCallable)
	int32 GetValue();
	
private:
	static USingletonObject* SingletonObject;
	int32 IntValue;		
};

USingletonObject* USingletonObject::SingletonObject=nullptr;

USingletonObject* USingletonObject::GetSinletonObjectIns(){
	if(SingletonObject==nullptr){
		SingletonObject=NewObject();
	}
	return SinletonObject;
}

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 设置为自定义的单例类。会自动生成与销毁

  • 把它当成全局常量来用,不建议运行中修改其中的变量数据

UE4 C++设计模式:单例模式(Singleton Pattern)_第1张图片

单例类代码,修改

USingletonObject* USingletonObject::GetSingletonObjectIns()
{
	if (SingletonObject == nullptr) // 也可以判断 GEngine
	{
		SingletonObject = Cast(GEngine->GameSingleton);
	}
	return SingletonObject;
}

 UE4 C++ 笔记(二):基础知识_老闫在努力的博客-CSDN博客_ue4

你可能感兴趣的:(UE4,设计模式,c++,设计模式,单例模式)