单例模式是设计模式中比较简单的一种。适合于一个类只有一个实例的情况,比如窗口管理器,打印缓冲池和文件系统, 它们都是原型的例子。典型的情况是,那些对象的类型被遍及一个软件系统的不同对象访问,因此需要一个全局的访问 指针,这便是众所周知的单例模式的应用。当然这只有在你确信你不再需要任何多于一个的实例的情况下。 单例模式的用意在于前一段中所关心的。通过单例模式你可以: 一、确保一个类只有一个实例被建立 二、提供了一个对对象的全局访问指针 三、在不影响单例类的客户端的情况下允许将来有多个实例 经典的单例模式有三种,懒汉式、饿汉式和 登记式。 懒汉式的特点是延迟加载,比如配置文件,采用懒汉式的方法,顾名思义,懒汉么,很懒的,配置文件的实例直到用到的时候才会加载。。。。。。
饿汉式的特点是一开始就加载了,如果说懒汉式是“时间换空间”,那么饿汉式就是“空间换时间”,因为一开始就创建了实例,所以每次用到的之后直接返回就好了。
class Singleton//懒汉模式
{
private:
Singleton(){}
public:
static Singleton* p;
static Singleton* getInstance();
};
Singleton* Singleton::p=NULL;
Singleton* Singleton::getInstance()
{
if(NULL==p)
{
if(mtx.try_lock())
{
p=new Singleton;
mtx.unlock();
}
}
return p;
}
class Singleton//饿汉模式
{
private:
Singleton(){}
public:
static Singleton* p;
static Singleton* getInstance()
{
return p;
}
};
Singleton* Singleton::p=new Singleton;
package Jcode;
/**
* 请实现一个单例模式的类,要求线程安全
* @author Administrator
*
*/
public class Item02 {
/**
* 内部类
* @author Administrator
*
*/
private static class Singleton{
private static Singleton sing = new Singleton();
}
/**
* 方式1.使用内部类的方式
* @return
*/
public static Singleton getInstance(){
return Singleton.sing;
}
private static Single single;
/**
* 方式2.使用double check instance
* @return
*/
public static Single getInstanceSingle(){
if(single == null){
synchronized(Item02.class){
if(single == null){
return new Single();
}
}
}
return single;
}
}
class Single{
}
class Singleton
{
public:
static Singleton *GetInstance()
{
return m_Instance;
}
int GetTest()
{
return m_Test;
}
private:
Singleton() { m_Test = 10; }
static Singleton *m_Instance;
int m_Test;
// This is important
class GC
{
public:
~GC()
{
// We can destory all the resouce here, eg:db connector, file handle and so on
if (m_Instance != NULL)
{
cout << "Here is the test" << endl;
delete m_Instance;
m_Instance = NULL;
}
}
};
static GC gc;
};
Singleton *Singleton::m_Instance = new Singleton();
Singleton::GC Singleton::gc;
int main22(int argc, char *argv[])
{
Singleton *singletonObj = Singleton::GetInstance();
if (singletonObj)
{
cout << singletonObj->GetTest() << endl;
}
system("pause");
return 0;
}