软件开发常用设计模式—单例模式总结

发表于:2015-4-08 10:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:木棉和木槿    来源:51Testing软件测试网采编

  单例模式:就是只有一个实例。
  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 实例确实没有被初始化呢,那么两个线程都会去运行并创建实例,此时就不满足单例类的要求了。那么我们需要写上线程同步的功能。
41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号