单例模式是设计模式中比较简单的一种。适合于一个类只有一个实例的情况,比如窗口管理器,打印缓冲池和文件系统, 它们都是原型的例子。典型的情况是,那些对象的类型被遍及一个软件系统的不同对象访问,因此需要一个全局的访问 指针,这便是众所周知的单例模式的应用。当然这只有在你确信你不再需要任何多于一个的实例的情况下。 单例模式的用意在于前一段中所关心的。通过单例模式你可以: 一、确保一个类只有一个实例被建立 二、提供了一个对对象的全局访问指针 三、在不影响单例类的客户端的情况下允许将来有多个实例 经典的单例模式有三种,懒汉式、饿汉式和 登记式。 懒汉式的特点是延迟加载,比如配置文件,采用懒汉式的方法,顾名思义,懒汉么,很懒的,配置文件的实例直到用到的时候才会加载。。。。。。
饿汉式的特点是一开始就加载了,如果说懒汉式是“时间换空间”,那么饿汉式就是“空间换时间”,因为一开始就创建了实例,所以每次用到的之后直接返回就好了。
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; }