IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 设计模式之Singleton模式 -> 正文阅读

[C++知识库]设计模式之Singleton模式

单例模式的优点和缺点:

优点:

  • 节约内存:保证内存里只有一个实例,减少内存的开销;
  • 资源共用:可以避免对资源的多重占用;
  • 访问自由:调用端可以随时访问单例类中的资源,起到优化和共享资源。

缺点:

  • 扩展困难:单例类中的构造函数,其访问权限都是private,导致无法被继承;一般没有多余接口,如果需要接口扩展,只能修改单例类代码,别无他法,违背了设计七大原则中的【开闭原则】
  • 不利于代码调试:在并发测试中,如果单例模式没有执行完成,不能再生成一个新的对象;
  • 违背单一指责原则:功能代码写在一个类中,如果功能设计不合理,则很容易违背【单一职责原则】

单例模式的实现 :

懒汉式单例:

类声明:

class LazySingleton
{
public:
	~LazySingleton();

public:

	/*
	* 创建实例对象
	*/
	static LazySingleton* getInstance();

	/*
	* 成员函数
	*/
	void printfInfo()
	{
		std::cout << "I'm LazyInstance!" << std::endl;
	}

	/*
	* 回收内存,销毁对象实例
	*/
	void destoryInstance();

private:
	LazySingleton();
	//~LazySingleton();
private:
	static /*volatile*/ LazySingleton *m_instance;
};

?说明:

  • 构造函数访问权限一定是private的;
  • 析构函数访问权限可以public,也可以private;
  • 定义一个private的静态对象指针变量;
  • 通过public的静态成员函数去初始化该对象指针,并返回获得该指针变量;
  • static成员函数,只能访问static成员变量;static成员变量也可以被no static成员函数访问。

?类实现:

/*volatile*/ LazySingleton* LazySingleton::m_instance = NULL;//静态成员变量,必须在类声明的外部初始化定义
LazySingleton::LazySingleton()
{
	std::cout << "LazySingleton::LazySingleton()..." << std::endl;
}

LazySingleton::~LazySingleton()
{
	std::cout << "LazySingleton::~LazySingleton()..." << std::endl;
}

LazySingleton* LazySingleton::getInstance()
{
	if (NULL == m_instance)
	{
		m_instance = new LazySingleton();
		std::cout << "Creat Object Instance..." << std::endl;
	}

	return m_instance;
};

void LazySingleton::destoryInstance()
{
	if (m_instance)
	{
		std::cout << "Destory Object Instance..." << std::endl;
		delete m_instance;
		m_instance = NULL;
	}
};

说明:

  • ?类的静态成员变量的初始化工作,必须放在类声明的外部;
  • ?对象指针创建以后,内存中有且只有一个存在。需要再次被创建,除非对已有对象指针进行销毁。
int main()
{
	/*
	* 单例对象的创建、调用和销毁
	*/
	std::cout << "------单例对象的创建、调用和销毁之【方法一】------" << std::endl;

	LazySingleton::getInstance()->printfInfo();
	LazySingleton::getInstance()->destoryInstance();

	std::cout << std::endl << std::endl;

	std::cout << "------单例对象的创建、调用和销毁之【方法二】------" << std::endl;
	LazySingleton* pInstance = LazySingleton::getInstance();
	if (pInstance)
	{
		pInstance->printfInfo();
		delete pInstance;
		pInstance = NULL;
	}

	system("pause");
	return 0;
}

说明:

  • 单例模式对象创建:在第一次调用getInstance方法时;
  • 析构函数访问权限:如果调用destoryInstance方法销毁指针,可声明为private;如果使用delete销毁,则声明为public。

饿汉式单例:

类声明:

class HungrySingleton
{
public:
	/*
	* 获取对象
	*/
	static HungrySingleton& getInstance();

	/*
	* 成员函数
	*/
	void printfInfo()
	{
		std::cout << "I'm HungryInstance!" << std::endl;
	}

private:
	HungrySingleton();
	~HungrySingleton();

	static HungrySingleton m_instance;//静态对象,在程序运行时被立即初始化
};

说明:?

  • 饿汉式单例在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的,可以直接用于多线程而不会出现问题。

类实现:

HungrySingleton HungrySingleton::m_instance;//注意:不可缺少
HungrySingleton::HungrySingleton()
{
	std::cout << "HungrySingleton::HungrySingleton()..." << std::endl;
}

HungrySingleton::~HungrySingleton()
{
	std::cout << "HungrySingleton::~HungrySingleton()..." << std::endl;
}

HungrySingleton& HungrySingleton::getInstance()
{
	return m_instance;
}

说明:

  • 静态变量在类声明之外,必须在写一遍。
int main()
{
	std::cout << "------单例对象的创建、调用和销毁之【方法一】------" << std::endl;
	HungrySingleton::getInstance().printfInfo();

	return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 09:54:07  更:2021-09-18 09:59:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 13:09:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计