《重学C++》8. 第8章 C++编程思想

对于各种设计模式解决了软件扩充时的难题,方便复用、后期改动小。

1. 单例模式:

单例模式特点是系统中该实例有且只有一个,并且其创建不被用户控制,用户需要使用时直接对唯一的实例进行唤醒。
例如:windows资源管理器、系统日志(日志只由一个程序读写,避免造成丢失等问题)。

根据上面的描述,从“创建不被用户控制”可知:实例的构造函数、事例对象需要是private的。那么如何在不能声明一个对象的情况下完成对对象的创建呢?这就需要该实例对象是static的,使用static不用手动管理资源分配、释放,还可以使得饿汉方式中实例对象永远存在(类似资源管理器,从开机到关机一直在后台运行);“用户需要使用时直接对唯一的实例进行唤醒”意味着需要实现一个专门用于返回实例的public方法,并且由于单例类不能被用户创建,这个方法只能是static的(否则没有对象可以调用这个方法)。

思路:

在singleTon类中有如下成员:

  • singleTon类型的指针This,静态私有数据成员(唯一的数据成员);
    This指针表示该单例模式的对象,只能存在一个。
  • getInstance(),返回This指针,静态公有函数成员;
    获取单例模式的对象,表示用户对单例模式对象的唤醒。
  • doSomething(),无返回值,静态公有函数成员;
    单例对象直接调用的方法,表示用户要求单例对象完成的某些功能。
  • 私有构造和析构函数,防止用户。

代码

下面的代码均省略头文件、宏定义等。
singleTon.h部分代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class singleTon
{
public:
static const singleTon* getInstance();
static void doSomething() {
std::cout << "do Something" << std::endl;
}

private:
static singleTon* This;

singleTon() {}
~singleTon() {}

};

singleTon.cpp

1
2
3
4
5
6
7
8
9
10
singleTon* singleTon::This = NULL;//如果不写这一句,将会出错,提示无法解析的外部命令
//singleTon* singleTon::This = new singleTon; //也可以写成这样,表示单例对象在类创建时就存在,这就是饿汉模式
const singleTon* singleTon::getInstance() {
if (This == NULL)
{
std::cout << "Create singleTon" << std::endl;
This = new singleTon;
}
return This;
}

主函数:

1
2
3
4
5
6
7
int main()
{
singleTon::getInstance()->doSomething();
singleTon::getInstance()->doSomething();

return 0;
}

运行结果:

单例模式怎么实现?这篇文章给你讲透
https://zhuanlan.zhihu.com/p/103058726

观察者模式

设计模式|菜鸟教程
https://www.runoob.com/design-pattern/design-pattern-tutorial.html