#include <iostream> using namespace std; class Singelton { public: static Singelton* GetInstance() { if (instance_ == NULL) { instance_=new Singelton; } return instance_; } private: Singelton(){} static Singelton* instance_; }; Singelton*Singelton::instance_; int main() { Singelton *s=Singelton::GetInstance(); Singelton *s2=Singelton::GetInstance(); }
#include <iostream> //头文件
using
namespace
std;
//命名空间
class
Singelton
//单例类
{
public
:
static
Singelton* GetInstance()
//提供了一个获取该单例类实指针的静态函数
{
if
(instance_ == NULL)
//判断该实例是否存在
{
instance_=
new
Singelton;
//不存在的话new一个
}
return
instance_;
//存在的话直接返回
}
private
:
Singelton()
//该单例类的构造函数
{
}
static
Singelton* instance_;
//该单例类的实例,静态
};
Singelton*Singelton::instance_;
int
main()
{
Singelton *s=Singelton::GetInstance();
//直接获取该单例类实例,因为不存在,所以这里会new一个
Singelton *s2=Singelton::GetInstance();
//直接获取该单例类实例,因为存在了,所以直接返回,此时s==s2
}
class SingletonStatic { private: static const SingletonStatic* m_instance; SingletonStatic(){} public: static SingletonStatic* getInstance() { return m_instance; } }; //外部初始化 before invoke main const SingletonStatic* SingletonStatic::m_instance = new SingletonStatic;二、饿汉模式:即无论是否调用该类的实例,在程序开始时就会产生一个该类的实例,并在以后仅返回此实例。
由静态初始化实例保证其线程安全性,WHY?因为静态实例初始化在程序开始时进入主函数之前就由主线程以单线程方式完成了初始化,不必担心多线程问题。
故在性能需求较高时,应使用这种模式,避免频繁的锁争夺。
JAVA实现详见:
http://www.iteye.com/topic/537563