设计模式----单例

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

你可能感兴趣的:(设计模式----单例)