在Qt框架中,对象单例(Singleton)和单类型(Single-instance types)是两种不同的设计模式,它们都用于确保某个类只有一个实例,但是应用场景和实现方式有所不同。

类对象单例(Singleton)

类对象单例是一种常见设计模式,在这种模式下,一个类全局仅有一个实例,这对于管理全局状态和资源访问控制是十分有用的。在Qt中,单例模式可以通过多种方式实现,比如使用 QSingleton 模式或者自定义单例实现,通常涉及以下几个核心步骤:

  1. 构造函数私有化: 确保只有类自己可以创建自己的实例。
  2. 提供一个静态方法: 通常是 instance() 方法,用于获取类的唯一实例。
  3. 静态实例: 在类内部保存唯一实例的静态引用,并在第一次调用 instance() 方法时创建。
  4. 拷贝构造和赋值操作禁止: 防止通过这些方式创建额外的实例。

示例代码如下:

class SingletonClass
{
public:
    static SingletonClass& instance()
    {
        static SingletonClass instance;
        return instance;
    }

private:
    SingletonClass() {} // 私有化构造函数

    // 禁止拷贝和赋值
    SingletonClass(SingletonClass const&) = delete;
    void operator=(SingletonClass const&) = delete;
};

在这个例子中,SingletonClass 使用一个静态方法 instance() 来返回一个静态局部变量的引用,它保证了线程安全并且只会在第一次调用 instance() 时才会创建实例。

单类型(Single-instance types)

在Qt Quick中,有一种模式被称为“单类型”,它通常用于将一个C++对象暴露给QML,而保证在QML环境中全局只会使用这一个实例。单类型不一定要求C++端的对象是一个单例,但确保了QML端只能访问同一对象实例。

可以通过 qmlRegisterSingletonType<T>() 函数注册一个单类型:

qmlRegisterSingletonType<MySingleton>("MyModule", 1, 0, "MySingleton",
    [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
        Q_UNUSED(engine)
        Q_UNUSED(scriptEngine)
        return new MySingleton();
    });

在这个例子中,我们通过提供一个工厂函数来创建 MySingleton 类的实例,并通过 qmlRegisterSingletonType 函数将这个实例注册为QML中的全局单例,该实例可以在QML文件中被访问。

区别与选择

类对象单例的主要目的是确保在整个应用程序的生命周期中,某个类只有一个实例。这适用于那些需要严格控制实例创建,并管理全局状态的场景。

单类型在Qt Quick应用程序中主要用于将C++后端的代码以单一实例的形式暴露给QML前端,涉及Qt的QML引擎和脚本引擎。它更多关注于前端访问的一致性,而非后端构造的限制。

在进行开发时,应当根据具体的应用场景和需求来选择使用单例模式或是单类型。如果是全局服务或状态管理,可能需要单例模式;如果是为了使QML环境下的不同组件能够访问到同一个后端服务对象,则可能需要使用单类型。

云服务器/高防CDN推荐

蓝易云国内/海外高防云服务器推荐


免备案五网CN2云服务器:www.tsyvps.com

蓝易云安全企业级高防CDN:www.tsycdn.com

持有增值电信营业许可证:B1-20222080【资质齐全】

蓝易云香港五网CN2 GIA/GT精品网络服务器。拒绝绕路,拒绝不稳定。

最后修改:2024 年 04 月 08 日
如果觉得我的文章对你有用,请随意赞赏