Singleton单例模式

Singleton单例模式Singleton 是对全局变量的取代策略作用 保证一个类只能有一个实例 并提供一个全局唯一的访问点 仅有一个实例 通过类的静态成员变量来体现 提供访问它的全局访问点 访问静态成员变量的静态成员函数来体现 设计模式 一书中给出了一种很不错的实现 定义一个单例类 使用类的私有静态指针变量指向类的唯一实例 并用一个公有的静态方法获取该实例 单例模式通过类本身来管理其唯一实例 这种特性提供了解决问题的方法 唯一的实例是类的一个普通对象 但设计这个类时 让它只能创建一个实例并提供对此实例的全局访问

本文在戒色文中做了部分修改,这是考虑最简单的singleton,暂未考虑多线程的情况,多线程的singleton之后会给出说明。

本文来自http://blog.csdn.net/yc7369原创

《设计模式》一书中给出了一种很不错的实现,定义一个单例类,使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例。

单例模式通过类本身来管理其唯一实例,这种特性提供了解决问题的方法。唯一的实例是类的一个普通对象,但设计这个类时,让它只能创建一个实例并提供对此实例的全局访问。唯一实例类Singleton在静态成员函数中隐藏创建实例的操作。习惯上把这个成员函数叫做Instance(),它的返回值是唯一实例的指针。

单例类Singleton有以下特征:

它有一个指向唯一实例的静态指针,并且是私有的;

它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例;

它的构造函数是私有的,这样就不能从别处创建该类的实例。

 

在Singleton模式的结构图中可以看到,我们通过维护一个static的成员变量_instance来记录这个唯一的对象实例。通过提供一个staitc的接口Instance来获得这个唯一的实例。

代码如下:

Singleton.h 

#ifndef _SINGLETON_H_ #define _SINGLETON_H_ class Singleton { private: static Singleton* pInstance;//静态成员,保存对象的唯一实例 Singleton();//私有化构造函数,使其无法在类外实例化 public: static Singleton* Instance(); ~Singleton(); }; #endif



Singleton.cpp

#include "Singleton.h" #include 
    
      using namespace std; Singleton* Singleton::pInstance = NULL; Singleton::Singleton() { cout<< "Singleton..." << endl; } Singleton* Singleton::Instance() { if(NULL == pInstance) { pInstance = new Singleton(); } return pInstance; } Singleton::~Singleton() { if (pInstance != NULL) { delete pInstance; pInstance = NULL; cout<< "Destroy..." << endl; } } 
    




 

Singleton不可以在外部实例化,因此我们将其构造函数声明为protected或者直接声明为private。

本文来自http://blog.csdn.net/yc7369原创

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208965.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午10:21
下一篇 2026年3月19日 上午10:21


相关推荐

  • 快速mysql导入sql文件_mysql肿么快速从sql文件导入数据库

    快速mysql导入sql文件_mysql肿么快速从sql文件导入数据库我的个人实践是:phpmyadmin导出utf-8的insert模式的abc.sqlftpabc.sql到服务器ssh到服务器mysql-uabc-puseKKK(数据库名,如果没有就createdatabaseKKK)setnames’utf8’sourceabc.sql注意:我看到setcharactersetutf8;的说法,那样不行,中…

    2022年10月2日
    5
  • 求平面方程的几种方法_平面及其方程

    求平面方程的几种方法_平面及其方程假设在三维世界中存在一个平面,如图  一个平面可以通过如下表达式表达                      (1)其中,(x,y,z)是在该平面上上的点的3D坐标。(A,B,C)能够构成该平面的一个法向量n。 那么,怎么通过一堆离散的点来求解这个平面呢?首先我们可以简单的用一个平面的法向量来表征一个平面。 方法1:假设在某个平面中存在着三个坐标点分别…

    2025年6月12日
    6
  • hdu5188 加限制的01背包问题「建议收藏」

    hdu5188 加限制的01背包问题

    2022年1月27日
    44
  • jdk1.8的环境配置「建议收藏」

    jdk1.8的环境配置「建议收藏」jdk1.8的环境配置原文地址:传送门每日必答:在开始之前呢,小Du来来带大家了解几个问题,希望能够在面试中,小Du的解答给你帮助。1.什么是JDK?答:javadevelopmentkit的缩写,意思是JAVA开发工具,我们写文档做PPT需要office办公软件,开发当然需要开发工具了,说到开发工具大家肯定会想到Eclipse,但是如果直接安装Eclipse你会发现它是运行不起来是会报错的,只有安装了JDK,配置好了环境变量和path才可以运行成功。2.JRE是什么?答:jav

    2022年6月11日
    38
  • JS数组删除指定下标元素「建议收藏」

    JS数组删除指定下标元素「建议收藏」splice方法——Array.splice(index,n)参数语义化理解:删除以下标index为起点的n个元素。(之后的元素会往前移动)

    2026年4月16日
    8
  • qmap的书写格式linux,QMap 键值存储「建议收藏」

    qmap的书写格式linux,QMap 键值存储「建议收藏」Qt中的QMap介绍与使用,在坛子里逛了一圈,发现在使用QMap中,出现过很多的问题,Map是一个很有用的数据结构。它以“键-值”的形式保存数据。在使用的时候,通过提供字符标示(键)即可得到想要的数据。这个“数据”即可以是一个字符串,也可以是任意对象,当然也包括自己定义的类对象。说明:map是以值传递的形式保存数据的。1.基本应用下面以“键-值”都是QString的例子说明QMap的基本使用方法…

    2022年5月7日
    79

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号