设计模式----单例 收藏
惭愧,到现在才知道设计 模式 这个概念,在我的理解设计模式就是一种解决 问题比较经典 的方法,在具体一点就是如何使用语言的特性来实现这些方法~ 这两个月一直看android camera这部分,发现它在声明halhardware对象的时候总是保证其只会有一个实例 ,因为这实际上是必须的,因为camera只有一个,所以只允许有一个camera硬件操作对象,如果同时存在多个的话那肯定就要乱套了。这个实际上就是设计模式上的singleton,下面我就结合着理论知识 和代码来研究下单例的实现过程。 首先从理论上讲,单例必须满足两个条件: 1、保证可控制地实现只有类的一个实例 2、必须提供这个实例的全局访问点 即一要保证唯一性,又要保证是可以全局可访问的。 我们看看camerahal类的定义的一部分: private: CameraHal(); virtual ~CameraHal(); static wp<CameraHardwareInterface> singleton; 很明显它包含了一个自身实例的静态弱引用指针,同时把唯一的默认构造函数放在private域,则在外部无法调用构造函数声明实例,这样就控制了实例被任意地创建。因为无法通过构造函数来创建实例,所以我们必须提供创建实例的方法。 如何提供一个可以供全局访问,同时能创建实例的方法呢?首先要实现全局访问,静态成员函数是一个很好的办法,但如何保证唯一性呢,我们可以在类中包含一个本身的实例(上面提到的wp),每次创建的时候都判断它是否为空,如果其为空说明没有实例,如果它 不为 空则说明已经有实例了: wp<CameraHardwareInterface> CameraHardwareStub::singleton; sp<CameraHardwareInterface> CameraHal::createInstance() { LOG_FUNCTION_NAME if (singleton != 0) { sp<CameraHardwareInterface> hardware = singleton.promote(); if (hardware != 0) { return hardware; } } sp<CameraHardwareInterface> hardware(new CameraHal()); singleton = hardware; return hardware; } 在这里实际上具有一个问题,因为在多线程环境下,singleton在没有保护的情况下操作很容易会存在竞争而声明多个实例,比如说两个线程同时打开这个函数,同时发下singleton为空,则就会创建出两个实例。因此在这里最好是加入锁控制,比如: wp<CameraHardwareInterface> CameraHardwareStub::singleton; sp<CameraHardwareInterface> CameraHal::createInstance() { LOG_FUNCTION_NAME { Mutex::Autolock lock(mLock); if (singleton != 0) { sp<CameraHardwareInterface> hardware = singleton.promote(); if (hardware != 0) { return hardware; } } } sp<CameraHardwareInterface> hardware(new CameraHal()); singleton = hardware; return hardware; } 这样一个单例模式就实现了,在c++中创建单例比较典型的就是上面的操作了,私有构造函数,静态存储本身的实例,静态全局instance函数。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yili_xie/archive/2009/11/12/4803351.aspx |
|