我看单例模式
来源:互联网 发布:酷开ulv3.0怎么连网络 编辑:程序博客网 时间:2024/04/29 05:28
最近工作,连续用到了三次单例模式。 一次是数据库的连接池,一次是公共的一个TCP连接对外发送数据,另一次是一个基于串口modem的短信收发接口。所以,在我看来,这个模式也是用的蛮多的。其实,刚来工作的时候读了一本很简单的设计模式的书,但是基本上没有记住,我看还是要运用才能纪下来把。呵呵。
先看看官方对单例模式的说法。
单例模式(Singleton),是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。(所以,单例模式主要用在只有创建一个对象的范围中,如单连接,配置信息读取等等)这种方式简化了在复杂环境下的配置管理。
实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。
单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。
有两种构建方式:
懒汉方式。指全局的单例实例在第一次被使用时构建。
饿汉方式。指全局的单例实例在类装载时构建。
我觉得有几点是要注意的,而且是这种模式的特点。
1.只有一个实例(为空时构造,不为空对外给出同一个)
2.返回实例的函数是个静态函数
3.类的构造函数定义为私有方法,其只能通过2静态函数构造时调用。
4.用互斥锁来解决在多线程中的使用。
代码例子
class Singleton
{
private:
static Singleton *instance;
Singleton()
{
}
public:
static Singleton *GetInstance()
{
if (NULL == instance)
{
instance = new Singleton();
}
return instance;
}
};
Singleton *Singleton::instance = NULL; // Attention !
int main(int argc, char* argv[])
{
Singleton *p1 = Singleton::GetInstance();
Singleton *p2 = Singleton::GetInstance();
if (p1 == p2)
{
cout < <"Two objects is the same instance" < <endl;
}
// system("PAUSE");
return 0;
}
也有人做了 这样的处理
对于“懒汉式”的单例模式,可以使用锁和双重判断的方式来避免重复创建的问题。
例如:
static Singleton *GetInstance()
{
if (NULL == instance)
{
lock()
{
if (instance == NULL)
instance = new Singleton();
}
}
return instance;
}
以后再学习其他模式吧。我觉得
- 我看单例模式
- 我看单例模式
- 我看设计模式
- 代理模式我还再续
- 我学设计模式
- 我看设计模式
- 我的常用模式
- 我看保护模式
- 我看保护模式
- 我说设计模式
- 我说设计模式
- 我说设计模式
- 我说设计模式
- 我说设计模式
- 我也大话设计模式--装饰模式
- 我学设计模式 之 观察者模式
- 我学设计模式 之 代理模式
- 我学设计模式 之 门面模式
- 如何知道自己的信息
- 成为编程高手的八大奥秘
- 面向搜索引擎的广告模式
- 一个功能强大的MFC界面处理扩展库:CJ60Lib简介
- 常见Visual C++开发使用问答(下)
- 我看单例模式
- 面向搜索引擎的URL设计
- C/C++中函数指针的含义(闭关修炼内功!哈哈!)
- Google相关性的三边关系
- 【转帖】我们应该学习什么 java、C#还是C++(VC)?
- 花5元可查身份信息 人肉搜索威力大增
- SEO公司应当问你的100个问题
- 高质量的内容提高搜索引擎流量
- 在Linux 下安装Matlab7的过程