您的位置:首页 > 其它

设计模式学习系列1 单例模式

2013-11-02 15:07 253 查看
为什么学习单例模式,因为单例模式用的比较广泛,游戏客户端的配置文件读取类,服务器日志类等等,都是使用单例模式来实现,单例模式也即是保证类只有一个实例,并且访问类全局的接口,这种方法可以使用全局来实现,但不能保证只存在一个,最好的办法是类中做限制,现在单例模式的实现方法有两种,一种称为饿汉式,类加载的时候就初始化,另外一种是懒汉式,在使用的时候创建对象

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 标签: 设计模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: