软件开发常用设计模式?单例模式总结
作者:网络转载 发布时间:[ 2015/4/8 14:02:17 ] 推荐标签:软件测试技术 用例设计 测试用例
单例模式:是只有一个实例。
singleton pattern单例模式:确保某一个类在程序运行中只能生成一个实例,并提供一个访问它的全局访问点。这个类称为单例类。如一个工程中,数据库访问对象只有一个,电脑的鼠标只能连接一个,操作系统只能有一个窗口管理器等,这时可以考虑使用单例模式。
众所周知,c++中,类对象被创建时,编译系统为对象分配内存空间,并自动调用构造函数,由构造函数完成成员的初始化工作,也是说使用构造函数来初始化对象。
1、那么我们需要把构造函数设置为私有的 private,这样可以禁止别人使用构造函数创建其他的实例。
2、又单例类要一直向系统提供这个实例,那么,需要声明它为静态的实例成员,在需要的时候,才创建该实例。
3、且应该把这个静态成员设置为 null,在一个public 的方法里去判断,只有在静态实例成员为 null,也是没有被初始化的时候,才去初始化它,且只被初始化一次。
通常我们可以让一个全局变量使得一个对象被访问,但它不能阻止你实例化多个对象。如果采用全局或者静态变量的方式,会影响封装性,难以保证别的代码不会对全局变量造成影响。
一个好的办法是,让类自身负责保存它的实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法,单例模式比全局对象好还包括,单例类可以继承。
单例模式又分为两种基本的情形:饿汉式和懒汉式
直接在静态区初始化 instance,然后通过 get 方法返回,这样这个类每次直接先生成一个对象,好像好久没吃饭的饿汉子,急着吃饭一样,急切的 new 对象,这叫做饿汉式单例类。或者是在 get 方法中才 new instance,然后返回这个对象,和懒汉字一样,不主动做事,需要调用 get 方法的时候,才 new 对象,这叫做懒汉式单例类。
如下是懒汉式单例类
1 //单例模式示例
2 class Singleton
3 {
4 public:
5 static Singleton * getInstance()
6 {
7 if (instance == NULL) {
8 instance = new Singleton();
9 }
10
11 return instance;
12 }
13
14 private:
15 //私有的构造函数,防止外人私自调用
16 Singleton()
17 {
18 cout << "实例化了" << count << "个对象!" << endl;
19 count++;
20 }
21 //声明一个静态实例,静态函数只能使用静态的数据成员。整个类中静态成员只有一个实例,通常在实现源文件中被初始化。
22 static Singleton *instance;
23 //记录实例化的对象
24 int count = 1;
25 };
26
27 Singleton * Singleton::instance = NULL;
28
29 int main(void)
30 {
31 Singleton::getInstance();
32 Singleton::getInstance();
33 Singleton::getInstance();
34 Singleton::getInstance();
35
36 return 0;
37 }
实例化了1个对象!
Program ended with exit code: 0
小结:
懒汉式单例模式是用时间换取控件,饿汉式单例模式,是用空间换取时间。
继续分析,考虑多线程下的懒汉式单例模式
上述代码在单线程的情况下,运行正常,但是遇到了多线程出问题,假设有两个线程同时运行了这个单例类,同时运行到了判断 if 语句,并且当时,instance 实例确实没有被初始化呢,那么两个线程都会去运行并创建实例,此时不满足单例类的要求了。那么我们需要写上线程同步的功能。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11