剑指Offer面试题:1.实现单例模式建议收藏

一题目:实现单例模式Singleton只能生成一个实例的类是实现了Singleton(单例)模式的类型。由于设计模式在面向对象程序设计中起着举足轻重的作用,在面试过程中很多公司都喜欢问一些与设计模

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

剑指Offer面试题:1.实现单例模式建议收藏此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“”,获取验证码。在微信里搜索“”或者“”或者微信扫描右侧二维码都可以关注本站微信公众号。

一 题目:实现单例模式Singleton

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

  只能生成一个实例的类是实现了Singleton(单例)模式的类型。由于设计模式在面向对象程序设计中起着举足轻重的作用,在面试过程中很多公司都喜欢问一些与设计模式相关的问题。在常用的模式中,Singleton是唯一一个能够用短短几十行代码完整实现的模式。因此,写一个Singleton的类型是一个很常见的面试题

二:单例模式的几种实现方法

(1)单线程单例模式

// 单例模式
class Singleton
{
private:
    Singleton(){}
    ~Singleton(){delete m_pSingleton;};

public:
    static Singleton* Instance();

private:
    static Singleton*m_pSingleton;
};

Singleton* Singleton::m_pSingleton = NULL;
Singleton* Singleton::Instance()
{
    if (!m_pSingleton)
    {
        m_pSingleton = new Singleton();
    }

    return m_pSingleton;
}

  这是一个很棒的实现,简单易懂。但这是一个完美的实现吗?不!该方法是线程不安全的,考虑两个线程同时首次调用instance方法且同时检测到p是NULL值,则两个线程会同时构造一个实例给p,这是严重的错误!同时,这也不是单例的唯一实现!

(2)懒汉单例模式

  a. 使用互斥对象实现懒汉模式

// 单例模式
class Singleton
{
private:
    Singleton(){};
    ~Singleton(){
        delete m_pSingleton;
        DeleteCriticalSection(&cs);}

public:
    static Singleton * Instance();

private:
    static Singleton *m_pSingleton;
    static CRITICAL_SECTION cs;
    static bool bInitCriticalSection;
};

CRITICAL_SECTION Singleton::cs = {0};
bool Singleton::bInitCriticalSection = false;
Singleton * Singleton::m_pSingleton = NULL;

Singleton * Singleton::Instance()
{
    if (!bInitCriticalSection)
    {
        InitializeCriticalSection(&cs);
        bInitCriticalSection = true;
    }
    if (!m_pSingleton)
    {
        EnterCriticalSection(&cs);
        m_pSingleton = new Singleton();
        LeaveCriticalSection(&cs);
    }

    return m_pSingleton;
}

  b. 使用内部静态变量实现懒汉模式

   此方法也很容易实现,在instance函数里定义一个静态的实例,也可以保证拥有唯一实例,在返回时只需要返回其指针就可以了。推荐这种实现方法,真得非常简单

// 单例模式
class Singleton
{
private:
    Singleton(){}
    ~Singleton(){DeleteCriticalSection(&cs);}

public:
    static Singleton * Instance();

private:
    static CRITICAL_SECTION cs;
    static bool bInitCriticalSection;
};

CRITICAL_SECTION Singleton::cs = {0};
bool Singleton::bInitCriticalSection = false;
Singleton * Singleton::Instance()
{
    if (!bInitCriticalSection)
    {
        InitializeCriticalSection(&cs);
        bInitCriticalSection = false;
    }
    EnterCriticalSection(&cs);
    static Singleton m_Singleton;
    LeaveCriticalSection(&cs);

    return &m_Singleton;
}

(3)饿汉单例模式

  饿汉实现本来就是线程安全的,不用加锁。为啥?自己想!

// 单例模式
class Singleton
{
private:
    Singleton(){};
    ~Singleton(){}

public:
    static Singleton * Instance();

private:
    static Singleton *m_pSingleton;
};

Singleton * Singleton::m_pSingleton = new Singleton();
Singleton * Singleton::Instance()
{
    return m_pSingleton;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120175.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 程序包无效:“CRX_HEADER_INVALID“

    之前在安装谷歌插件的时候遇到的问题,解决方法小技巧1、报错:程序包无效:“CRX_HEADER_INVALID”如图:原因是插件格式不对,谷歌无法进行解析。需要手动解压文件。2、解决方法将下载的crx文件后缀名改为.zip或者后缀名.rar。如果zip不行就改为rar。然后对文件进行解压到指定文件夹,点击加载已解压的扩展程序,选定所解压的指定文件夹。即可:方法参考网上…

  • JAVA reference_Java instanceof

    JAVA reference_Java instanceof本文介绍对象的强、软、弱和虚引用的概念、应用。1.对象的强、软、弱和虚引用  在JDK1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

  • MAC、OS系统上怎么安装MT4、MT5交易软件

    MAC、OS系统上怎么安装MT4、MT5交易软件对于有些交易易来说,如果自己的电脑是苹果电脑,想要在MACOS系统中操作和使用MT4/MT5软件,那么应该怎么办呢?其实还是有办法的。首先您可以在自己的苹果电脑中安装Wine,它是一个免费的程序,安装之后,您就可以运行Windows系统应用程序。由于Wine其实还不是一个完全稳定的程序,可能您在运行程序的时候又部分功能无法正常运作。所以建议您可以安装PlayOnMac,它是Wine相关的软件,更利于在MACOS系统中操作。在MacOS系统安装MT4/MT5交易软件主要可以分成两步:安装W

  • 数据库设计工具的使用(实用)

    数据库设计工具的使用(实用)使用数据库设计工具,以下sql语句全部可以自动生成:/*==============================================================*//*DBMSname:MySQL5.0*//*Createdon:2017/5/270:57:18

  • scrollLeft,scrollWidth,clientWidth,offsetWidth

    scrollLeft,scrollWidth,clientWidth,offsetWidthhttp://wenku.baidu.com/view/c1250d46b307e87101f6960d.htmlHTML:scrollLeft,scrollWidth,clientWidth,offsetWidth之完全详解(转)————————————————vars=””;s+=”网页可见区域宽

  • arping工具使用

    arping工具使用arping工具使用

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号