首页 > 编程语言 >C++单例模式

C++单例模式

时间:2023-08-25 12:15:07浏览次数:45  
标签:对象 模式 Single 实例 线程 C++ 单例

单例模式

什么是单例模式:

只能实例化一个类对象(全局有且只有一个类的static实例)

使用场景:

进程管理器、日志管理器、网站访问计数器、应用配置程序、线程池、服务器的连接管理器

实现单例模式的原理/步骤

1、禁止在类外随意实例化对象,把构造函数/拷贝构造都私有化private

2、确保类对象只有一份,在类中定义一个静态的类对象成员变量

3、需要提供一个换取静态类对象成员变量的公开接口,设计静态成员函数用于获取那唯一 的一个静态类对象

饿汉模式的单例:

程序运行开始时就立即实例化单例对象,不管后期是否用到都会完成实例化

缺点:如果后期并没有使用,就浪费资源、时间

优点:不可能被多个线程同时运行创建多份(线程安全)

#include <iostream>
using namespace std;

class Single
{
    static Single obj;    //定义一个静态成员变量
    Single(void)    //构造函数私有化
    {
        cout << "我是构造函数" << endl;    
    }
    Single(const Single& that)    //拷贝构造私有化
    {
        cout << "我是拷贝构造" << endl;    
    }
public:
    static Single& get_obj(void)    //设计静态成员函数作为接口
    {
        return obj;    
    }

    void show(void)
    {
        cout << &obj << endl;    
    }
};

Single Single::obj;    //静态成员初始化

int main(int argc,const char* argv[])
{
//    Single::obj;
    Single& s = Single::get_obj();
    s.show();
    Single& s1 = Single::get_obj();
    s1.show();
}

输出:

我是构造函数    //说明只实例化了一次
0x804a0d4
0x804a0d4

懒汉模式的单例:

什么时候使用,就什么时候实例化单例类对象

优点:使用时才会去创建,节约时间、资源

缺点:可能会被多个线程同时实例化,有可能会创建出多个单例类对象(线程不安全),

实例:

#include<iostream>
using namespace std;

class Single
{
    static Single* obj;
    Single(void)
    {
        cout << "我是构造函数" << endl;    
    }
    Single(const Single& that)
    {
        cout << "我是拷贝构造" << endl;    
    }
public:
    static Single& get_obj(void)
    {
        if(NULL == obj)
        {
            obj = new Single;    
        }
        return *obj;    
    }

    void show(void)
    {
        cout << obj << endl;    
    }
};

Single* Single::obj;

int main(int argc,const char* argv[])
{
    Single& s = Single::get_obj();
    s.show();
    Single& s1 = Single::get_obj(); 
    s1.show();
}

标签:对象,模式,Single,实例,线程,C++,单例
From: https://www.cnblogs.com/ljf-0804/p/17656583.html

相关文章

  • c++ stl std::sort使用例子
    classUser{public:int32_tm_fight_power;private:int32_tm_level;};boolCenterData::compare(constUser*left,constUser*right){if(left->m_fight_power!=right->m_fight_power){returnleft->m_fight_power>ri......
  • Java设计模式
    装饰器模式:装饰器模式是指在不改变现有对象结构的情况下,动态的给改对象增加一些职责(即增加其额外功能)的模式。装饰器模式通常在以下几种情况使用。当需要给一个现有类添加附加职责,而又不能采用生成子类的方法进行扩充时。例如,该类被隐藏或者该类是终极类或者采用继承方式会产生......
  • C++异常处理:try、throw、catch
    ​1.引子程序在运行时,总是会遇到一些错误,这些错误或者是导致程序无法运行,例如操作空指针,或是不符合正常运行的规律,例如除以0。因此,在C++程序当中就必须添加对应异常处理机制,在检测到指定的程序异常时,为保证程序正常运行,需要跳转至异常处理程序当中。常规的错误处理有以下几种解......
  • postgresql建表空间、建库、建模式、建用户的规范
    一、官方概念说明1、表空间(表空间位置不应该位于数据目录内)性能优化:您可以将高I/O的表和索引放在高速磁盘上,而将不经常访问的表放在普通的磁盘上。管理磁盘空间:当数据库存储空间不足时,可以通过表空间在其他磁盘上创建更多的存储空间。如果没有上面2个诉求,可以使用默认表空间......
  • C++静态成员(static)
    静态成员(static)什么是静态成员:被static修饰的成员/成员函数就叫静态成员,不管有多少对象,静态成员只有一份存于公共内存中。设计静态数据成员目的是信息共享和信息交流普通成员特点:成员变量:每个类对象中都有一份属于自己的成员变量,相互独立、没有关联。普通成员与对象绑定,随......
  • C++11 四种强制类型转换的区别
    static_cast:指针强转,如果某个基类有多个子类,基类的指针实际是指向A类的对象,但使用强转为B类对象,运行时会报错,静态强转没做检测dynamic_cast:只能用于虚函数类,子类与父类指针互转,会检测,转换失败为返回空,不会崩const_cast:用于转换常量,修改常量,先用一个常......
  • C++拷贝构造、赋值函数
    拷贝构造拷贝构造就是一种特殊版本的构造函数,格式:类名(const类名&that){    //执行给每个成员变量进行赋值  }什么时候会调用拷贝构造:当使用旧对象(已new的)给新对象(新new的)初始化时,会自动调用拷贝构造    Testt1;//调用无参构造Testt2=t1......
  • C++this指针、常函数
    this指针this指针的类型:类类型*const。不能被修改和赋值。只能在成员函数的内部使用。全局函数、静态函数都不能使用this.this指针本质上其实是一个成员函数的形参(栈),是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。this指针是成......
  • C++静态成员和单例模式
    一、静态成员Ⅰ.什么是静态成员:被static修饰的成员变量和成员函数就叫静态成员Ⅱ.普通成员的特点:成员变量:每个类对象中都有一份属于自己的成员变量,相互之间没有关联、独立的成员函数:隐藏着一个this指针,接收调用者的地址用于区分调用者Ⅲ.静态成员的特点:静态成员变......
  • C++对象的创建和销毁过程分析
    对象的创建和销毁过程分析1、对象的创建过程①给对象划分内存空间(栈、堆)②执行初始化列表根据继承表的顺序调用父类的无参构造或有参构造通过:父类(val)调用父类的有参构造根据成员变量的定义顺序调用类类型成员的无参构造或有参构造通过:类类型成员名(val)调用类类型成员......