• 单实例设计模式及C++实现


    单例模式:作为对象的创建模式,单例模式确保其中一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。该实例被所有程序模块共享。
    #include <iostream>
    using namespace std;
    
    //单例类的C++实现
    class Singleton
    {
    private:
           Singleton();//注意:构造方法私有
           static Singleton* p_instance;//惟一实例
           int var;//成员变量(用于测试)
    public:
           static Singleton* GetInstance();//(用来获得实例)
           int getVar();//获得var的值
           void setVar(int);//设置var的值
           virtual ~Singleton();
    };
    //构造方法实现
    Singleton::Singleton()
    {
           this->var = 20;
           cout<<"Singleton Constructor"<<endl;
    }
    Singleton::~Singleton()
    {
           cout<<"Singleton Destructor"<<endl;       
    }
    
    Singleton* Singleton::p_instance =0;  //类的静态成员必须在类外初始化 http://blog.csdn.net/veryday_code/article/details/7921833
    
    Singleton* Singleton::GetInstance()
    {
           if(p_instance == 0)
           {
                  p_instance = new Singleton();
           }
           return p_instance;
    }
    
    int Singleton::getVar()
    {
           return this->var;
    }
    
    void Singleton::setVar(int var)
    {
           this->var = var;
    }
    
    int main()
    {
          
           Singleton *ton1 = Singleton::GetInstance();
    
           Singleton *ton2 = Singleton::GetInstance();
    
           if(ton1==ton2)
    
                  cout<<"ton1==ton2"<<endl;
    
           cout<<"ton1 var = "<<ton1->getVar()<<endl;
    
           cout<<"ton2 var = "<<ton2->getVar()<<endl;
    
           ton1->setVar(150);
    
           cout<<"ton1 var = "<<ton1->getVar()<<endl;
    
           cout<<"ton2 var = "<<ton2->getVar()<<endl;
    
           delete Singleton::GetInstance();//必须显式地删除
          
    }

    以上程序使用了new操作符为唯一实例分配存储空间,因为new是线程安全的,所以在多线程应用中可以使用此设计模板,但是有一个缺陷就是在应用程序结束之前必须手工用delete摧毁实例。

    下面代码实现了专门用于单线程的应用,不需要手动delete

    #include <iostream>
    using namespace std;
    class Singleton
    {
    private:
           Singleton();//注意:构造方法私有
           int var;//成员变量(用于测试)
    public:
           static Singleton* GetInstance();//工厂方法(用来获得实例)
           int getVar();//获得var的值
           void setVar(int);//设置var的值
           virtual ~Singleton();
    };
    //构造方法实现
    Singleton::Singleton()
    {
           this->var = 20;
           cout<<"Singleton Constructor"<<endl;
    }
    Singleton::~Singleton()
    {
           cout<<"Singleton Destructor"<<endl;
           //delete instance;
    }
    Singleton* Singleton::GetInstance()
    {
        static Singleton instance;
        return &instance;
    }
    int Singleton::getVar()
    {
           return this->var;
    }
    void Singleton::setVar(int var)
    {
           this->var = var;
    }
    int main()
    {
            Singleton* ton1 = Singleton::GetInstance();
            cout<<ton1->getVar()<<endl;
            Singleton* ton2 = Singleton::GetInstance();
            ton2->setVar(444);
            if(ton1==ton2)
            {
                cout<<"ton1 == ton2"<<endl;
            }
            cout<<ton1->getVar()<<endl;
    
    }
  • 相关阅读:
    批量杀掉多个pid文件中记录的pid进程, 并集成到shell脚本中
    把tomcat服务器配置为windows服务的方法
    idea导入java项目
    linux-umount挂载点无法卸载:device is busy(解决)
    简单(基本)的风光摄影照片后期处理-新手教程-ps照片后期基本处理
    golang 打包,交叉编译,压缩
    mac下Fiddler的安装-启动
    修改ElementUI源码样式
    linux里面的命令:./和. /(这里有空格)的区别
    linux下mysql源码安装
  • 原文地址:https://www.cnblogs.com/buptmemory/p/2949527.html
Copyright © 2020-2023  润新知