剑指offer-面试题2.实例Singleton模式

题目:设计一个类,我们只能生成该类的一个实例


这道题显然是对设计模式的考察,很明显是单例模式。什么是单例模式呢,就是就像题目所说的只能生成一个类的实例。那么我们不难考虑到下面几点:

1.不能new多个对象,那么必然该类的构造函数是私有的

2.类对象只有一个,那么必然该对象只能有一个私有的静态成员变量,该成员变量为类实例或者类实例的指针。

3.但是我们同时还要考虑到如果获取这个唯一对象实例,那么该类必然有一个公有的成员函数来获取这个唯一的类实例然    而由于不允许new对象,那么必须提供一种类操作该接口的方式,很显然就是静态成员函数。

 

至此不难写设计出这样一个类:

<span style="font-family:Times New Roman;">class CSingle
{
private:
    CSingle()  //私有构造函数,禁止new对象实例
    {
    }
    static CSingle *m_pInstance;  //私有静态全局变量,保证唯一性
public:
    static CSingle * GetInstance()  //提供一个共有接口获取该唯一类实例
    {
        if(m_pInstance == NULL)
            m_pInstance = new CSingle();
        return m_pInstance;
    }
};</span>

那么我们构造这个唯一实例是这样的:

<span style="font-family:Times New Roman;">CSingle *Single=CSingle::GetInstance();//当该唯一实例不存在时,这是唯一获取类实例的方法。</span>
<span style="font-family:Times New Roman;">CSingle *Single1=Single->GetInstance();//当上一步执行后便可用此方法获取唯一类实例</span>
<span style="font-family:Times New Roman;">
</span>
<span style="font-family:Times New Roman;"><span style="margin: 0px; padding: 0px; font-family: 'comic sans ms', sans-serif; font-size: 18px; line-height: 30.6000003814697px;"><span style="margin: 0px; padding: 0px; color: rgb(255, 0, 0);">当然也可以这样:</span></span>
</span>
<span style="font-family:Times New Roman;"><span style="margin: 0px; padding: 0px; font-size: 18px; line-height: 30.6000003814697px;"><span style="margin: 0px; padding: 0px;"></span></span></span><pre name="code" class="cpp"><span style="font-family:Times New Roman;">CSingle & Single1=Single->GetInstance();</span>

上面的做法对于单线程来说可以表现的很好了,但是对于多线程来说,就可能有问题了。当两个线程同时创建实例的时候,这时候实例不存在,这时候就可能产生两个类实例,于是我们就需要用同步的方法保证创建的时候只有一个线程。线程同步的方法很多,可以是临界区,可以是互斥等。


 
 
<img src="http://img.blog.csdn.net/20160407191829186?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />



你可能感兴趣的:(面试题,剑指offer)