设计模式(一)单例模式

单例模式,就是对一个类来说,只有一个实例化对象(这句话不是很准确,但请不要纠结于细节,无意义)。

单例有什么好处呢?因为对于整个程序来说(其实是进程),都只有一个实例,那么一些全局的变量和操作(比如链接文件关闭文件)就可以用这个唯一的对象来控制。

如何让类只有一个实例对象?对于C++来说,当创建一个对象时,一定会调用类的构造函数。如果让构造函数非public呢?外部不就不能创建类的实例对象了?

但是又需要有一个实例对象,怎么办呢?类成员的public等访问属性,是针对类外部的数据访问而言的(派生类对基类来说也是外部的),类本身的接口可以访问类里面的所有数据成员和成员函数,非public属性的构造函数当然也可以。

说再多,不如直接上代码(visual studio 2019):

#pragma once

#include <iostream>

class GlobalParam
{
public:
	static GlobalParam& GetInstance() {
		static GlobalParam cInstance;
		return cInstance;
	}

	void SetValue(int value) { m_value = value; }

	int GetValue() const { return m_value; }

protected:
	GlobalParam() = default;
	~GlobalParam() = default;

private:
	int m_value{ 0 };
};


void fun1()
{
	GlobalParam::GetInstance().SetValue(15);
}

void fun2()
{
	GlobalParam& param = GlobalParam::GetInstance();
	std::cout << "value = " << param.GetValue() << std::endl;
}

int main()
{
	std::cout << "value = " << GlobalParam::GetInstance().GetValue() << std::endl;
	fun1();
	fun2();
	system("pause");
	return 0;
}

以上代码逻辑非常简单,一个GlobalParam的单例类,类里面有一个int类型的变量m_value,初始值为0,还有两个接口SetValue和GetValue。

fun1里修改单例类对象的值,fun2中获取单例类对象的值并打印。

主函数里先打印全局类的m_value值,调用fun1改变值,再调用fun2。

执行结果如下:

可以看到,fun1中的修改,对fun2有用。

这就是对C++来说最简单的单例:

1、构造函数非public;

2、有一个static的成员函数,返回值为类的引用,函数中定义static的静态对象,返回该对象。

有没有其他方式?

有,但是不想多说,还能定义一个智能指针等等,也不需要去了解。

单例,还有所谓的懒汉模式和饿汉模式,也不用去了解,前面一篇文章中已经说了,学习设计模式,不要纠结于细节,学习它的思想!

还有关于线程的,谢谢你,不要在评论里提醒我,我知道。

但我问一下:你的程序,真的有必要开多线程么?线程本身的开销,你考虑过么?多线程结束后,数据的处理开销,你考虑过么?把这些全部考虑进去,你的多线程,真的对效率有多大提升?和多线程给程序带来的复杂程度相比,这点鸡毛蒜皮的提升,真的有必要?

我可以说,以现在硬件的执行速度,就国内的水准软件,百分之九十以上的程序都不需要多线程。那些用多线程的,绝大部分仅仅只是为了炫技!熟不知,你的这些技巧,在高手眼里,就是一坨翔。

软件最重要的是什么?是框架?是语言?是多线程?都是鬼扯,是设计!设计!设计!

很不幸,国内绝大多数学校/培训机构/公司的招聘人员,都在纠结于技术细节,本末倒置!为什么如此?因为他们自己都不知道设计是个什么东西。

再强调一遍,设计模式,学习思想,不要纠结那些细枝末节。单例模式,上面那个简单的例子理解透,其思想就掌握了绝大部分。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值