C++单例模式

简介: C++中使用模板实现单例模式的方法,并通过一个具体的类A示例展示了如何创建和使用单例。
#pragma once

namespace utility
{
    // 需要拼接一下命名空间 utility
#define SINGLETON(x) (friend class utility::##Singleton<x>);

    template <typename T>
    class Singleton
    {
    public:
        static T* instance()
        {
            if (m_instance == nullptr)
            {
                m_instance = new T();
            }
            return m_instance;
        }
    private:
        Singleton(){}
        Singleton(const Singleton<T>&);
        Singleton<T>& operator = (const Singleton<T>&);
        ~Singleton(){}
    private:
        static T* m_instance;
    };

    template <typename T>
    T* Singleton<T>::m_instance = nullptr;
}
#pragma once
#include "Singleton.h"
#include <iostream>
#include <string>

class A
{
    // 声明为友元类Singleton才能创建A的实例
    // friend class utility::Singleton<A>;
    SINGLETON(A);
public:
    void show()
    {
        std::cout << __FUNCTION__ << m_name << std::endl;
    }
private:
    A() : m_name(" name"){}
    A(const A&);
    A& operator = (const A&);
    ~A(){}
private:
    std::string m_name;
};
#include "A.h"
#include "Singleton.h"
using namespace utility;

int main()
{
    //1. 类A构造为私有(无法在模板单例类中创建instance实例)使用友元类解决
    //2. 对于多线程可能创建多个实例的问题(在主线程中先创建规避掉那种情况即可)
    Singleton<A>::instance();

    A* instanceA1 = Singleton<A>::instance();
    A* instanceA2 = Singleton<A>::instance();

    std::cout << "A1: " << instanceA1 << std::endl;
    std::cout << "A2: " << instanceA2 << std::endl;

    instanceA1->show();
    instanceA2->show();

    getchar();
    return 0;
}
相关文章
|
6月前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
142 0
|
6月前
|
设计模式 安全 测试技术
【C++】—— 单例模式详解
【C++】—— 单例模式详解
|
6月前
|
C++
C++实现单例模式-多种方式比较
单例模式,面试中经常被问到,但是很多人只会最简单的单例模型,可能连多线程都没考虑到,本文章从最简单的单例,到认为是最佳的单例模式实现方式,单例模式没有什么知识点,直接上源码
89 0
|
6月前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
47 0
|
3月前
|
安全 C++
C++ QT 单例模式
C++ QT 单例模式
52 0
|
3月前
|
设计模式 安全 IDE
C++从静态类型到单例模式
C++从静态类型到单例模式
38 0
|
4月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
57 2
|
5月前
|
设计模式 存储 缓存
C++ -- 单例模式
**摘要:** 单例模式确保一个类仅有一个实例,并提供全局访问点。为了实现单例,构造函数通常设为私有,通过静态成员函数来创建和返回实例。两种常见实现是饿汉模式(在类加载时创建实例,线程安全但可能导致不必要的内存占用)和懒汉模式(首次使用时创建,可能需线程同步)。拷贝构造函数和赋值运算符通常被禁用来防止额外实例的创建。单例模式适用于资源管理、缓存和线程池等场景。在C++中,静态成员变量和函数用于存储和访问单例实例,保证其生命周期与程序相同。
|
6月前
|
安全 程序员 C语言
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(下)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
53 5
|
6月前
|
设计模式 编译器 Linux
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(中)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
41 0