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

}

 

posted on 2013-03-08 11:07  mymemory  阅读(234)  评论(0编辑  收藏  举报

导航