单一设计模式(Singleton)
什么是Singleton模式? Sigleton模式的设计意图是:保证一个类只有一个对象实例,并提供一个访问对象实例的全局访问点。 如果我们想实现一个全局范围可见的对象以替代麻烦缠身的全局变量,那么最好的做法就是将数据封装在一个特殊的类中。这个严格管理数据的创建过程以保证数据的唯一性,同时不允许程序员随意创建该类的对象实例。虽然不能通过类的构造函数获得对象实例,但可以通过该类提供的静态成员函数得到该类唯一的对象实例的指针或引用。 Singleton模式和全局变量有什么区别: 全局变量的问题: (1)变量名冲突:必须小心维护变量名规则,所有工程师在开发代码时,每遇到一个全局变量,都必须仔细分辨该变量究竟属于哪个模块、哪个程序。 singleton模式的优点: Singleton模式示例代码: } 运用singleton模式:
利用static关键字创建单一对象的数据结构 可以用在很多地方!在配合模板与类继承机制,可以达到一个管理器的作用! 基本代码: class Singleton { public: static Singleton* getSingleton(); private: static Singleton* mInstance; Singleton() { }; ~Singleton() { if(mInstance ) {delete mInstance ; mInstance = 0; } } ; } Singleton* Singleton::mInstance = 0; Singleton* Singleton::getSingleton() if( ! mInstance ) mInstance = new Singleton(); return mInstance ; 在外部调用的时候不用考虑这个对象的内存管理!把构造放在私有空间,保证只有一个对象可以分配内存,外面调用的时候直接使用接口 Singleton::getSingleton(); 但是这个函数局限性很大!不能扩展! 结合模板后可以更好的利用这种设计模式,代码如下: template<typename T> static T* getSingletonPtr(void) else else 只要有上面有这样一个模板类,以后的一些管理类就可以继承这个类 class Manager :public Singleton<Manager> ...... 完成声明后还需要初始化一下 模板的静态成员 template<> Manager* Singleton<Manager>::msInstance = 0; 在使用 Manager mgr = Manager::getSingleton();前需要先外部分配内存 也就是程序初始化的时候声明一个Manager* Mgr = new Manager(); 以后不管在哪个类里面只需要包含一下Manager.h就可以使用静态函数获得Manager的对象内存来完成管理 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |