概述

描述

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

套路

  • 将默认构造函数设为私有, 防止其他对象使用单例类的 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;
    }

参考

最新文章

  1. 【FLUENT案例】04:利用DDPM+DEM模拟鼓泡流化床
  2. Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)
  3. HDFS中JAVA API的使用
  4. js:方法1. 数组
  5. ASP.NET中数据邦定效率问题的一点看法 - 转载(自由的天空)
  6. 移动API-restful的设计原则和参考
  7. ref游标(动态游标)
  8. 【rails3教材】博客构建过程
  9. tomcat生成ssl证书
  10. bootstrap兼容IE
  11. JavaScript- The Good Parts Chapter 3 Objects
  12. 5.android系统裁剪
  13. 关于升级linux下apache
  14. RasterBandClass Class
  15. Polipo
  16. iPhone safari中Document事件不触发的解决方案 [冒泡]
  17. 前端自动化测试python+webdriver
  18. 蚂蚁代理免费代理ip爬取(端口图片显示+token检查)
  19. centos如何设置固定IP
  20. oracle竖表转横表字段合并

热门文章

  1. 算法:实现strStr(),字符串indexOf方法
  2. dubbo 2.7应用级服务发现踩坑小记
  3. Vue配置axios
  4. jquery实现强制刷新
  5. FastAPI 学习之路(一)fastapi--高性能web开发框架
  6. find命令查找某一个时间点以后创建或者修改的文件
  7. php图片处理库
  8. JAVA语言程序设计课程评价
  9. TP5模型开启事务
  10. 5ucms静态发布卡住解决办法