Singleton单例类模式

时间:2021-09-15 08:08:15

body, table{font-family: 微软雅黑; font-size: 10pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

单例设计模式(singleton)
内存中只能有一份对象
//单例设计模式:类在内存中只能有1个实例
//实现步骤:
1. 将构造函数私有化。
2. 在类中定义一个静态的指针对象(可为私有,可为公有),并在类外初始化为空
3. 定义一个返回值为类指针的静态成员函数,如果2中的指针对象为空,则初始化对象,以后再有对象调用该静态成员函数的时候,不再初始化对象,而是直接返回对象,保证类在内存中只有一个实例。
//要求: 内存中一个类只能产生一个对象
//1. 该对象不能是栈对象, 全局对象   ;全局变量会破坏“封装”特性,还有对象空间程序运行期间一直存在
//2. 将构造函数放入private区域,才能满足第一步
//3. 在public区域提供一个静态成员函数,通过就这个函数实现最多只有一个对象实例
//4. 提供一个static数据成员,释放资源
#include <iostream>
#include<stdio.h>
using namespace std;
class Singleton
{
        private:
                Singleton()       //声明为私有,防止类外调用
                {
                        cout<<"Singleton()"<<endl;
                }
                ~Singleton()
                {
                        cout<<"~Singleton()"<<endl;
                }
                static Singleton * _pInstance;
        public:
                static Singleton * getInstance()       //保证类只有一个实例
                {
                        if(_pInstance==NULL)
                        {
                                _pInstance = new Singleton;
                        }
                        return _pInstance;
                }
                static void destroy()
                {       
                        cout<<"destroy()"<<endl;
                        delete _pInstance;    //因为是静态的,一次delete就全部删除了
                        //delete p1;
                }
};
Singleton * Singleton::_pInstance = NULL;
int main()
{
        Singleton * p1 = Singleton::getInstance();
//对象才能调用成员函数,所以getInstance()必须为static
        Singleton * p2 = Singleton::getInstance();
        Singleton * p3 = Singleton::getInstance();
        printf("p1=%p\n",p1);
        printf("p2=%p\n",p2);
        printf("p3=%p\n",p3);
        Singleton::destroy();
        //delete p1;    释放一个还有其他的指针还在
        return 0;
}
Singleton单例类模式
//这个单例类有一个bug,就是多次申请虽然内存中只有一个对象,但是却有多个指针保存这个对象的地址,当对象释放的时候,其他指针就变成野指针了;
//改进,static Singleton& getInstance()  
static Singleton& getInstance()
{
    if(_pInstance==NULL)
    {
         _pInstance = new Singleton;
    }
    return *_pInstance;   //返回一个对象引用;
}
Singleton &p1 = Singleton::getInstance();

Singleton单例类模式的更多相关文章

  1. Unity Singleton 单例类(Unity3D开发之二十)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/47335197 ...

  2. Unity Singleton 单例类&lpar;Unity3D开发&rpar;

    一.添加单例模板类 using UnityEngine; public class Singleton<T> : MonoBehaviour where T : MonoBehaviour ...

  3. C&plus;&plus;中的单例类模板

    1,本节课讲述单例类模式,实现并抽取相关代码实现单例类模板,在以后开发工作 中,如果想要使用单例模式,那么直接使用今天开发的单例类模板就可以: 2,需求的提出: 1,在架构设计时,某些类在整个系统生命 ...

  4. &lbrack;Android面试题-7&rsqb; 写出一个Java的Singleton类(即单例类)

    1.首先明确单例的概念和特点: a>单例类只能有一个实例 b>单例类必须自己创建一个自己的唯一实例 c>单例类必须为其他所有对象提供这个实例 2.单例具有几种模式,最简单的两种分别是 ...

  5. Singleton&lpar;单例&rpar;模式

    Singleton(单例)模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. public class Singleton { private static Singleton ourIns ...

  6. C&plus;&plus; Singleton &lpar;单例&rpar; 模式最优实现

    参考:http://blog.yangyubo.com/2009/06/04/best-cpp-singleton-pattern/ 索引 静态化并不是单例 (Singleton) 模式 饿汉模式 懒 ...

  7. java双重检测或枚举类实现线程安全单例&lpar;懒汉模式&rpar;

    双重检测实现 /** * 懒汉模式->双重同步锁单例模式 */ public class SingletonExample5 { private SingletonExample5() { } ...

  8. javascript的单例&sol;单体模式&lpar;Singleton&rpar;

    首先,单例模式是对象的创建模式之一,此外还包括工厂模式.单例模式的三个特点:1,该类只有一个实例2,该类自行创建该实例(在该类内部创建自身的实例对象)3,向整个系统公开这个实例接口 Java中大概是这 ...

  9. 单例&sol;单体模式&lpar;Singleton&rpar;

    单例/单体模式(Singleton) 首先,单例模式是对象的创建模式之一,此外还包括工厂模式. 单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3, ...

随机推荐

  1. &lbrack;1&rsqb;开发准备-使用C&num;&period;NET开发基于本地数据缓存的PC客户端

    小记:本人是PHPer,对C#.NET的开发只能说看得懂,也写得了功能略简单的PC客户端程序,下面的是本人开发一款名叫“理财速记”的PC客户端软件的全过程记录,期间包括比较繁琐的C#.NET资料查询等 ...

  2. C&num;的初始化器

    using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...

  3. Hbase快速开始——shell操作

    一. 介绍 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...

  4. oracle表中某个字段含有字符回车、空格的手动修改方式

    select t.*, t.rowid from TB_SD_STANDARD_CHOOSE_ADVISE t where t.id =323900000 update TB_SD_STANDARD_ ...

  5. MongoDB命令行操作

    本文专门介绍MongoDB的命令行操作.其实,这些操作在MongoDB官网提供的Quick Reference上都有,但是英文的,为了方便,这里将其稍微整理下,方便查阅. 这里用来做测试的是远端(10 ...

  6. Android常用控件之ExpandableList的使用

    先来看下什么是ExpandableListView 跟列表有点像,这种是可以折叠的列表,下面来看下是如何在代码中实现 一.在布局文件中声明一个ExpandableListView <Linear ...

  7. C&plus;&plus;中的字符串的输入输出函数、空字符与空格的区别、字符变量赋值和字符串初始化

      一.字符串输入输出函数 1.  cin.get()   逐个字符输入输出 2.  cin 可以将整个字符串一次性输入,但是,cin将空格.Tab和回车键,因此不能用于数组的一次性输入. 注意:ci ...

  8. arcgis 10 File GDB转成9&period;3 File GDB

    背景:已有的File GDB数据是在ArcGIS 10下面创建的,在运行9.3的电脑上无法读取,需要转换成低版本. 方法: 1.在ArcGIS Toolbox中找到相关工具(datamanagemen ...

  9. CSS网页菜单

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserContro ...

  10. mysql 5&period;6 binlog组提交实现原理&lpar;转载&rpar;

    http://blog.itpub.net/15480802/viewspace-1411356/ Redo组提交 Redo提交流程大致如下 lock log->mutex write redo ...