zoukankan      html  css  js  c++  java
  • Singleton单例类模式

    单例设计模式(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 ",p1);
            printf("p2=%p ",p2);
            printf("p3=%p ",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();





  • 相关阅读:
    Spring Boot (十四): Spring Boot 整合 Shiro-登录认证和权限管理
    Spring Boot (十三): Spring Boot 小技巧
    救人一命是怎样的体验?
    如何做一个对账系统
    人工智能发展史-从图灵测试到大数据
    编程科普书籍推荐
    springcloud(十):服务网关zuul
    springcloud(九):配置中心和消息总线(配置中心终结版)
    springcloud(八):配置中心服务化和高可用
    springcloud(七):配置中心svn示例和refresh
  • 原文地址:https://www.cnblogs.com/meihao1203/p/8830109.html
Copyright © 2011-2022 走看看