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;
}
//这个单例类有一个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 单例类(Unity3D开发)

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

  3. C++中的单例类模板

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

  4. [Android面试题-7] 写出一个Java的Singleton类(即单例类)

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

  5. Singleton(单例)模式

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

  6. C++ Singleton (单例) 模式最优实现

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

  7. java双重检测或枚举类实现线程安全单例(懒汉模式)

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

  8. javascript的单例/单体模式(Singleton)

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

  9. 单例/单体模式(Singleton)

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

随机推荐

  1. git 移除某个文件的版本管理

    1:最简单的,在项目刚创建的时候,在根目录的.gitignore,加入该文件的相对路径 2:已经被纳入到了版本控制,使用在当前目录下,打开cmd窗口 输入rm命令,加上文件的绝对路径(相对路径没试过) ...

  2. (转载)sql注入实战 mysql篇

    出现的关键名词有: UNION  SELECT   load_file   hex 为了方便说明我们先创建两个表:hehe和heihei,很明显它们一个拥有2列属性,一个拥有3列属性 ======== ...

  3. Java linkedList详细介绍及使用示例

    ①LinkedList简单介绍 是一个继承于AbstractSequentialList的双向链表.它可以被当成堆栈.队列或双端队列进行操作. 实现了List接口,能对它进行队列操作. 实现了Dequ ...

  4. ServletConfig获取Servlet的公共参数方法

    web.xml配置: <servlet> <servlet-name>AServlet</servlet-name> <servlet-class>AS ...

  5. PHP秒杀系统全方位设计分析(一)

    秒杀系统特点人多商品少时间短流量高外挂机器[黄牛和非黄牛] 技术分析瞬间高并发的处理能力多层次的分布式处理能力人机交互与对抗[12306验证码图片] 技术选型分析Linux+Nginx+PHP+Mys ...

  6. Visual Studio 2015 初体验

    据微软介绍每次发布的新版本,都承载着为开发者提供最高效的Visual Studio开发体验的使命.Visual Studio 2015亦延续了这一趋势,为开发者带来了进一步的生产力创新,包括调试和诊断 ...

  7. 解题报告:hdu2602 Bone collector 01背包模板

    2017-09-03 15:42:20 writer:pprp 01背包裸题,直接用一维阵列的做法就可以了 /* @theme: 01 背包问题 - 一维阵列 hdu 2602 @writer:ppr ...

  8. java将配置信息写在数据库(利用反射)

    Demo出处: 1. package com.fpx.pcs.prealert.process.xml.service.impl; public class CainiaoPushMessageSer ...

  9. 记录一下我的mac的环境变量的配置参数

    #配置jdk环境export JAVA_7_HOME=/Library/java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Homeexport JAV ...

  10. [Vue]webpack的require与require.context

    1.require 1.1完整路径的require语句: require('tools'); //preset alias tools require('./js/main'); 1.2带表达式的 r ...