【C/C++语言系列】实现单例模式

1.单例模式概念

定义 :单例模式是一种常见的设计模式,它可以保证系统中一个类只有一个实例,而且该实例易于外界访问(一个类一个对象,共享这个对象)。
条件

  1. 只有1个对象
  2. 易于外界访问
  3. 共享这个对象

使用情况 :如果希望某个类只有一个对象,就可以使用单例模式。

**案例:**windows的任务管理器,可以重复打开,但是只会出现一个

2.代码分步骤编写

cpp 复制代码
class Person{
	
};

void test(){
	Person p1;
	Person p2;
	Person p3 = new Person;
}

正常代码框架如上所示,这样这个类就不止一个对象的,所以第一步:

  1. 将默认构造函数私有化:防止创建多个对象
cpp 复制代码
class Person{
private:
	Person(){};
};

void test(){
	//Person p1;   //默认构造函数私有化,都不能创建了
	//Person p2;
	//Person* p3 = new Person;  
}

但是这样一个对象都没有了

  1. 只要拿到一个对象的指针即可,这个指针指向唯一的对象
cpp 复制代码
class Person{
private:
	Person(){};
public:   //这个指针容易外界访问
	static Person* person;  //唯一(静态)的对象指针
};
Person* Person::person = new Person;   //静态变量实现(类内不管权限都能调用构造函数)
void test(){
	Person* c1 = Person::person;  //c1 == c2,它们指向相同
	Person* c2 = Person::person;
}

但是会出现一个问题:

cpp 复制代码
c1 = NULL; //或者
Person::person = NULL;

那么这个类就访问不到了,因为权限太高,可以使用get、set方法。

  1. 将唯一的指针私有化,提供只读方法(不提供set方法)
cpp 复制代码
class Person{
public:
	static Person* getInstance(){   //静态成员函数get方法(只能类去访问)
		return person;
	}
private:
	Person(){};
private:   //改为私有
	static Person* person;  //唯一(静态)的对象指针
};
Person* Person::person = new Person;   //静态变量实现
void test(){
	Person* p1 = Person::getInstance();
	Person* p2 = Person::getInstance();
}

但会出现以下问题:

cpp 复制代码
Person* p3 = new Person(*p1); //拷贝构造,p3 != P1产生了新的对象
  1. 将拷贝构造函数私有化
cpp 复制代码
class Person{
public:
	static Person* getInstance(){   //静态成员函数get方法(只能类去访问)
		return person;
	}
private:
	Person(){};  //默认构造函数私有化
	Person(const Person&){}  //拷贝构造函数私有化
private:   //改为私有
	static Person* person;  //唯一(静态)的对象指针
};
Person* Person::person = new Person;   //静态变量实现
void test(){
	Person* p1 = Person::getInstance();  //p1 == p2
	Person* p2 = Person::getInstance();
}

总结

单例模式是一种常见的设计模式,我们需要掌握它,熟练了可以直接看最后一步的代码。一个补充,单例对象在main函数调用之前生成了(静态变量在编译阶段就分配了内存)

相关推荐
wuminyu3 小时前
Kafka中sendfile与mmap实现机制解析
java·linux·c语言·jvm·c++
Blockbuater_drug4 小时前
FreeSASA: 开源 SASA 计算库,pip 一条命令替代 NACCESS
c语言·开源·sasa·freesasa·溶剂可及表面积·naccess·python api
Logic1015 小时前
C语言/数据结构位运算题解:异或XOR找出蛋糕订单中的“VIP独特口味“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
Logic1016 小时前
C语言/数据结构位运算题解:异或XOR找出飞行棋中的“独特颜色棋子“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
Logic1018 小时前
C语言/数据动态规划题解:翻转一次子数组后的最大子数组和——四状态DP(O(n)时间O(1)空间)
c语言·数据结构·动态规划·时间复杂度·算法题·状态机dp·最大子数组和
无小道8 小时前
C++——列表初始化
c++·列表初始化
blueSatchel8 小时前
c++action 编写(ros-humble)
c++·ros2
Logic10110 小时前
C语言/数据结构字符串题解:找出DNA序列中未配对的独特序列——排序+遍历(O(nlogn))
c语言·数据结构·字符串·数组·排序·时间复杂度·算法题
老赵的博客10 小时前
c++面试之从虚函数表到Rtti一次性讲清楚
c++·qt
Navigator_Z10 小时前
LeetCode //C - 1248. Count Number of Nice Subarrays
c语言·算法·leetcode