当前位置: 首页 > news >正文

C++单例模式实现

目录

1.提出的需求

​​​​​​​2.如何定义一个类,使得这个类最多只能创建一个对象?

​​​​​​​3.代码

​​​​​​​4.小结


C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

​​​​​​​1.提出的需求

在架构设计时,某些类在整个系统生命期中最多只能有一个对象存在( Single Instance)。

​​​​​​​2.如何定义一个类,使得这个类最多只能创建一个对象?

要控制类的对象数目,必须对外隐藏构造函数

思路

  1. 将构造函数的访问属性设置为 private
  2. 定义instance 并初始化为 NULL
  3. 当需要使用对象时,访问instance 的值

空值:创建对象,并用instance 标记

非空值: 返回instance 标记的对象

​​​​​​​3.代码

#include <iostream>
#include <string>

using namespace std;
class SObject
{
    static SObject* c_instance;
    
    //1.将构造函数的访问属性设置为 private
    //拷贝构造声明成私有不使用
SObject(const SObject&);

    //声明成私有不使用
    SObject& operator= (const SObject&);
    
    //声明成私有不使用
    SObject()
    {
    }
public:
    static SObject* GetInstance();
    
    void print()
    {
        cout << "this = " << this << endl;
    }
};

//静态成员变量类外初始化
//定义instance 并初始化为 NULL
SObject* SObject::c_instance = NULL;

//静态成员函数类外初始化
SObject* SObject::GetInstance()
{
    //当需要使用对象时,访问instance 的值
    //空值:创建对象,并用instance 标记
    //非空值: 返回instance 标记的对象
    if( c_instance == NULL )
    {
        c_instance = new SObject();
    }
    
    return c_instance;
}

int main()
{
    SObject* s = SObject::GetInstance();
    SObject* s1 = SObject::GetInstance();
    SObject* s2 = SObject::GetInstance();
    
    //唯一对象
    s->print();
    s1->print();
    s2->print();
    
    return 0;
}

​​​​​​​4.小结

单例模式是开发中最常用的设计模式之一

单例模式的应用使得一个类最多只有一个对象

 

相关文章:

  • java八股系列——依赖注入的方式
  • 前端基础知识
  • MDK Keil5 创建Stm32工程-理论篇(这里以Stm32F103Zet6为例)
  • 电路模型和电路定律(2)——“电路分析”
  • C++中的利器——模板
  • Python绘图
  • 【Linux】-- 基本指令
  • 核心 Android 调节音量的过程
  • 微信小程序this指向问题
  • synchronized从入门到踹门
  • 运算符——“Python”
  • Nginx的搭建与核心配置
  • Stream——数字类型的字符串排序
  • FISCO BCOS(二十八)———使用java SDK与区块链交互
  • <JVM上篇:内存与垃圾回收篇>13 - 垃圾回收器
  • 《剑指offer》分解让复杂问题更简单
  • Apache的基本使用
  • Docker容器管理
  • JDK 6和JDK 7中的substring()方法
  • k个最大的数及变种小结
  • MySQL的数据类型
  • nginx 配置多 域名 + 多 https
  • PAT A1120
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • vue-loader 源码解析系列之 selector
  • Web设计流程优化:网页效果图设计新思路
  • 阿里云购买磁盘后挂载
  • 初识MongoDB分片
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 猴子数据域名防封接口降低小说被封的风险
  • 如何优雅地使用 Sublime Text
  • 如何在GitHub上创建个人博客
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • ​​​​​​​​​​​​​​Γ函数
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (C#)一个最简单的链表类
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (万字长文)Spring的核心知识尽揽其中
  • (已解决)什么是vue导航守卫
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • .Net CF下精确的计时器
  • .NET delegate 委托 、 Event 事件
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET中 MVC 工厂模式浅析
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解