单例模式是设计模式中最为简单,最为常见,最容易实现的一种模式了。单例模式就是保证一个类仅有一个实例,并提供一个访问它的全局访问点。数据库
从概念上来理解,咱们就能了解单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行建立这个实例;三是它必须自行向整个系统提供这个实例。
从具体实现角度来讲,就是如下三点:一是单例模式的类只提供私有的或者受保护的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于建立或获取它自己的静态私有对象。设计模式
优势 函数
1.单例模式会阻止其余对象实例化其本身的单例对象的副本,从而确保全部对象都访问惟一实例。 性能
2.由于类控制了实例化过程,因此类能够灵活更改实例化过程。spa
3.因为在系统内存中只存在一个对象,所以能够节约系统资源,对于一些须要频繁建立和销毁的对象单例模式无疑能够提升系统的性能设计
缺点 code
1.虽然数量不多,但若是每次对象请求引用时都要检查是否存在类的实例,将仍然须要一些开销。能够经过使用静态初始化解决此问题。 对象
2.使用单例对象(尤为在类库中定义的对象)时,开发人员必须记住本身不能使用new关键字实例化对象。由于可能没法访问库源代码,所以应用程序开发人员可能会意外发现本身没法直接实例化此类。blog
3.因为单利模式中没有抽象层,所以单例类的扩展有很大的困难。接口
4.单例类的职责太重,在必定程度上违背了“单一职责原则”。
5.滥用单例将带来一些负面问题,如为了节省资源将数据库链接池对象设计为的单例类,可能会致使共享链接池对象的程序过多而出现链接池溢出;若是实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将致使对象状态的丢失。
单例模式在开发中常常用到,开发过程当中有些变量咱们必须保证它是惟一的,如:打印机的实例,资源管理器的实例等等。
说明:
单例模式的具体实现代码量不是特别大,全部不作过多说明,可是有几点咱们须要说明一下,首先,由于咱们须要SingletonModel类不能被实例化,这样的话咱们就须要把构造函数申明为protect或者private,而不能是public。而后,咱们经过一个static的数据成员来记录这个惟一的实例化对象,经过提供一个static的接口GetInstance来得到这个实例对象。
类图:
实现代码:
SingletonModel.h
1 #pragma once 2 3 class CSingletonModel 4 { 5 private: 6 static CSingletonModel* singel; 7 CSingletonModel(); 8 9 public: 10 static CSingletonModel* GetInstance() 11 { 12 if (singel == NULL) 13 { 14 singel = new CSingletonModel; 15 } 16 17 return singel; 18 } 19 };
SingletonModel.cpp
1 #include "StdAfx.h" 2 #include "SingletonModel.h" 3 4 CSingletonModel* CSingletonModel::singel = NULL; 5 6 CSingletonModel::CSingletonModel() 7 { 8 }
main函数
1 #include "stdafx.h" 2 #include "stdlib.h" 3 #include "SingletonModel.h" 4 5 int _tmain(int argc, _TCHAR* argv[]) 6 { 7 CSingletonModel* s1 = CSingletonModel::GetInstance(); 8 CSingletonModel* s2 = CSingletonModel::GetInstance(); 9 10 if (s1 == s2) 11 { 12 printf("OK\n"); 13 } 14 else 15 { 16 printf("Error\n"); 17 } 18 19 system("pause"); 20 return 0; 21 }
运行结果: