一、讲在前面的废话
笔者曾经多次面试都遇到了这个问题,请你说一下软件的设计模式,一般我们都会把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);
}
}
五、单例模式的适用场景
- 系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源管理器,或者需要考虑资源消耗太大而只允许创建一个对象。
- 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。
本文深入探讨了面试中常见的设计模式——单例模式,详细介绍了其概念、分类,包括懒汉式和饿汉式实现,并讨论了在多线程环境下如何处理,同时阐述了单例模式适用的场景。
1017

被折叠的 条评论
为什么被折叠?



