分享

设计模式----单例

 xrzs 2010-02-24
  设计模式----单例 收藏
 惭愧,到现在才知道设计 模式 这个概念,在我的理解设计模式就是一种解决 问题比较经典 的方法,在具体一点就是如何使用语言的特性来实现这些方法~
        这两个月一直看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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多