设计模式学习系列1 单例模式
为什么学习单例模式,因为单例模式用的比较广泛,游戏客户端的配置文件读取类,服务器日志类等等,都是使用单例模式来实现,单例模式也即是保证类只有一个实例,并且访问类全局的接口,这种方法可以使用全局来实现,但不能保证只存在一个,最好的办法是类中做限制,现在单例模式的实现方法有两种,一种称为饿汉式,类加载的时候就初始化,另外一种是懒汉式,在使用的时候创建对象
1懒汉模式指针版本
class singletonP { //类中默认生成的 构造函数,copy构造函数,赋值设置为私有变量 private: singletonP(){str = "懒汉模式 使用指针注意释放问题哦";} ~singletonP(){}; // 析构的时候不会调用 static singletonP * pSingle ; string str ; class CGarbo //它的唯一工作就是在析构函数中删除singletonP的实例 { public: ~CGarbo() { if(singletonP::pSingle) delete singletonP::pSingle; } }; static CGarbo Garbo; //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数 public: // ~singletonP(); // 获得类方法的接口,在第一次使用的时候创建 static singletonP* GetSingletonP() { if(pSingle == NULL) //多线程情况下需要双重锁定 pSingle = new singletonP() ; return pSingle ; } void printNum() { cout << str << "\n" << endl ; } };
这种写法需要注意释放问题,因为静态变量和全局变量一样实在系统结束的时候系统释放,利用这个特征,建一个局部类,专门用来释放需要师范的参数
2懒汉模式静态局部变量
class singletonA { //类中默认生成的 构造函数,copy构造函数,赋值设置为私有变量 private: singletonA() { str = "局部变量懒汉模式" ; } ~singletonA() { } singletonA(const singletonA& single); singletonA operator=(const singletonA& single); string str ; public: // 获得类方法的接口,在第一次使用的时候创建 static singletonA* GetSingletonA() { static singletonA SingleClass; return &SingleClass ; } void printNum() { cout << str << "\n" << endl ; } };
这种方法是用的比较多的,其中构造函数,赋值函数全部私有化,只提供局部静态的返回接口
3饿汉模式
class singletonE { //类中默认生成的 构造函数,copy构造函数,赋值设置为私有变量 private: singletonE() { str = "饿汉模式注意多线程中的锁哦"; } ~singletonE() { } static singletonE SingleClass ; string str ; public: static singletonE* GetSingletonE() { return &SingleClass ; } void printNum() { cout << str << "\n" << endl ; } };
4单例模式总结
对于线程安全,还有一种双重锁的写法
单例模式使用静态变量,如果出现互相之间的调用需要注意初始化顺序等问题
可以参考的文章:
Technorati 标签: 设计模式