设计模式——单例模式 Singleton

本文详细介绍了设计模式中的单例模式,旨在确保一个类只有一个实例,并提供全局访问点。文章讨论了单例模式的特点,如唯一实例、私有构造函数以及静态工厂方法。同时,还涉及到了C++中实现单例模式的懒汉模式,并给出了相关的面试题,以加深对单例模式的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 意图

什么是单例模式?在GOF的《设计模式:可复用面向对象软件的基础》中这样描述:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

2. 单例模式特点

  • 单例类仅有一个且唯一的实例
  • 单例类必须在自己内部创建该实例;要构造一个实例,就必须调用该类的构造函数,因此该类的构造函数须定义为protected或private这样客户端程序就不能通过构造函数创建实例
  • 向其他类提供这个实例类(静态实例是公有的);

除此之外,单例模式还有很多有用的特点,比如爱奇艺2016研发工程师面试题中:单例模式的类具有?

  • A. 没有公有构造方法,有一个公有静态工厂方法和一个静态实例变量
  • B. 没有公有构造方法,有一个私有静态工厂方法和一个静态实例变量
  • C. 有公有构造方法,没有静态工厂方法和静态实例变量
  • D. 没有公有构造方法,没有静态工厂方法,也没有静态实例变量

答案及分析:A。分析待写

3. C++代码实现

(1)懒汉模式:它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果对象存在就不再创建,直接返回。

#include <iostream>
/** 单例模式类
 *  by @BigoSprite 2016/06/19
 */
class Singleton{
public:
	static Singleton *GetInstance(){
		if (_instance == nullptr){
			_instance = new Singleton();
		}
		// 测试日志
		std::cout << "GetInstance()" << std::endl;
		return _instance;	
	}// 公有静态方法,获取实例

private:
	Singleton(){}// 构造方法private或者protected
	static Singleton *_instance;// 静态实例变量
};

Singleton * Singleton::_instance = nullptr;

void main(){
	Singleton *singleton = Singleton::GetInstance();// = new Singleton();// WRONG!!!
	std::cin.get();
}
(2)饿汉模式:在类加载的时候就立即创建对象,不需要像懒汉模式那样需要先判断类对象是否存在,然后再决定是创建还是直接返回。
#include <iostream>
/** 单例模式类
 *  by @BigoSprite 2016/06/19
 */
class Singleton{
public:
	static Singleton *GetInstance(){
		return _instance;
	}

private:
	static Singleton *_instance;
	Singleton(){}
};
// C++静态变量要在类外实现
Singleton* Singleton::_instance = new Singleton();

void main(){
	Singleton *singleton = Singleton::GetInstance();// = new Singleton();// WRONG!!!
	std::cin.get();
}
以上两种方式是单例模式最简单的两种,但是这种实现方式有时候会有问题,比如:在多线程情况下,我们需要创建多个Singleton。下面对代码进行改善,考虑多线程的单例模式:
(3)考虑多线程的单例模式

待续...






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值