设计模式----单例

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值