面试官最喜欢考的设计模式---单例设计模式

本文深入探讨了面试中常见的设计模式——单例模式,详细介绍了其概念、分类,包括懒汉式和饿汉式实现,并讨论了在多线程环境下如何处理,同时阐述了单例模式适用的场景。
一、讲在前面的废话

笔者曾经多次面试都遇到了这个问题,请你说一下软件的设计模式,一般我们都会把23种模式例举几个出来,如果没有说错,你一定会列举单例设计模式,这样的话你就中了面试官的圈套了。接下来的一般情况就是让你细说单例设计模式,然后写代码。

二、单例设计模式概述

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。下面是构建单例设计模式的条件:

  • 是单例模式的类只提供私有的构造函数,
  • 是类定义中含有一个该类的静态私有对象,
  • 是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象
三、单例设计模式的分类

我们都知道,单例设计模式分为懒汉式和饿汉式,而他们两种有涉及到线程是否安全。
下面我们通过代码来分析

懒汉式代码
class A_lazy
{
private:
    A_lazy(){}
public:
    static A_lazy* getInstance()
    {
        if(s_sgl == NULL)
        {
            s_sgl = new A_lazy;
        }
        return s_sgl; 
    }
    ~A_lazy(){}
private:
    static A_lazy* s_sgl;
};

A_lazy *A_lazy::s_sgl = NULL;

饿汉式的代码

class B_hungry
{
private:
    B_hungry(){}
public:
    static B_hungry* getInstance()
    {
        return s_ghy;
    }
private:
    static B_hungry* s_hgy;
};
//Init初始化
B_hungry *B_hungry::s_hgy = new B_hungry;
四、单例碰到多线程
//懒汉式
class A_lazy
{
private:
    A_lazy(){}
public:
    static A_lazy* getInstance()
    {
        if(s_sig == NULL)
        {
            s_sig = new A_lazy;
        }
        return s_sig;
    }
private:
    static A_lazy* s_sig;
};

A_lazy *A_lazy::s_sig = NULL;
//饿汉式
class B_hungry
{
private:
    B_hungry(){}
public:
    static B_hungry* getInstance()
    {
        return s_ghy;
    }
private:
    static B_hungry* s_hgy;
};
//Init初始化
B_hungry *B_hungry::s_hgy = new B_hungry;

DWORD WINAPI MyThread_hangry(LPVOID lpThreadParameter)
{
    B_hungry* bh = B_hungry::getInstance();
    cout << "单例对象地址" << (int*)chair << endl;
    return 0;
}

//饿汉式单例碰到多线程测试
void thread_A_lazy()
{
    HANDLE handler[10];
    for (int i = 0; i < 10;i++)
    {
    handler[i] = CreateThread(NULL,NULL, MyThread_hangry, NULL, NULL, NULL);
    }
}

DWORD WINAPI MyThread_lazy(LPVOID lpThreadParameter)
{
    A_lazy* chairman = A_lazy::getInstance();
    cout << "单例对象地址:" << (int*)chairman << endl;
    return 0;
}

//懒汉式单例碰到多线程
void thread_hgy()
{
    HANDLE handler[10];
    for (int i = 0; i < 10; i++)
    {
        handler[i] = CreateThread(NULL,NULL, MyThread_lazy, NULL, NULL, NULL);
    }
}
五、单例模式的适用场景
  • 系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源管理器,或者需要考虑资源消耗太大而只允许创建一个对象。
  • 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_Web3_社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值