设计模式学习笔记(四)—单例模式

  • 概念

单例模式是设计模式中最为简单,最为常见,最容易实现的一种模式了。单例模式就是保证一个类仅有一个实例,并提供一个访问它的全局访问点。

从概念上来理解,我们就能了解单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的或者受保护的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

  • 优缺点

 优点

1.单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。

2.因为类控制了实例化过程,所以类可以灵活更改实例化过程。

3.由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能

缺点

1.虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。

2.使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。

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 }

运行结果:

 

posted @ 2016-08-06 15:42  灯火阑珊231  阅读(234)  评论(0编辑  收藏  举报