单实例设计模式及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;

}

原文链接: https://www.cnblogs.com/buptmemory/archive/2013/03/08/2949527.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/80001

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午7:21
下一篇 2023年2月9日 下午7:21

相关推荐