单例模式通用类

本文介绍了一种实现线程安全的单例模式的方法,该方法使用了.NET框架下的volatile关键字和lock语句来确保实例创建过程的线程安全性。此外,还使用了Activator类来实例化类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

namespace System
{
    /// <summary>
    /// 为指定的实例创建有线程安全的单例模式。实例必须有一个公开的,无参数的构造方法,并且能正确的被实例化。
    /// </summary>
    /// <typeparam name="T">作为单例的对象。</typeparam>
    public static class Singleton<T>
       where T : class
    {
        static volatile T _instance;
        static object _lock = new object();

        /// <summary>

        /// 为指定对象创建实例。

        /// </summary>

        public static T CreateInstance()
        {
            if (_instance == null)
            {
                lock (_lock)
                {
                    if (_instance == null)
                    {
                        _instance = Activator.CreateInstance<T>();
                    }
                }
            }
            return _instance;
        }
    }
}

  

转载于:https://www.cnblogs.com/XuPengLB/p/8022300.html

### C++ 中实现单例模式封装 #### 使用懒汉式(Lazy Initialization) 懒汉式的单例模式会在第一次调用 `getInstance` 方法时创建对象实例。 ```cpp #include <iostream> #include <mutex> class Singleton { private: static Singleton* instance; Singleton() {} // 私有化构造函数 public: ~Singleton() {} static Singleton* getInstance() { std::call_once(initFlag, [](){ instance = new Singleton(); }); return instance; } void showMessage(const char* message) const { std::cout << "Message from singleton: " << message << std::endl; } private: static std::once_flag initFlag; }; // 初始化静态成员变量 Singleton* Singleton::instance = nullptr; std::once_flag Singleton::initFlag; int main() { Singleton* s = Singleton::getInstance(); s->showMessage("Hello World"); } ``` 此代码片段展示了一个线程安全版本的懒加载单例模式[^1]。通过使用 `std::call_once` 和 `std::once_flag` 来确保即使在多线程环境下也只会初始化一次实例。 #### 饿汉式(Eager Initialization) 饿汉式的单例模式会提前创建好对象,在程序启动的时候就完成实例化的操作,这种方式简单但是不够灵活。 ```cpp #include <iostream> class Singleton { private: static Singleton instance; // 提前声明并定义唯一的实例 Singleton() {} public: static Singleton& getInstance() { return instance; } void showInfo() const { std::cout << "This is a eager initialized singleton." << std::endl; } }; // 定义唯一实例 Singleton Singleton::instance; int main() { Singleton &s = Singleton::getInstance(); s.showInfo(); } ``` 这段代码实现了饿汉式的单例模式[^3]。由于实例是在编译期间就已经被创建好了,因此不存在任何延迟初始化的情况。 #### 基于模板的泛型单例模式 对于更通用的需求,可以考虑基于模板来构建一个能够适用于多种型的单例基: ```cpp template<typename T> class SingletonTemplate { protected: SingletonTemplate() {} virtual ~SingletonTemplate() {} public: template<typename... Args> static T* getInstance(Args&&... args) { static T inst(std::forward<Args>(args)...); return &inst; } }; ``` 上述代码给出了一个利用模板参数列表支持传参构造器的单例模式实现方案[^4]。这使得该模式不仅限于无参构造器,还可以适应带有不同数量和型参数的对象创建过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值