添砖加瓦:设计模式(单例模式)

Posted 落雷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了添砖加瓦:设计模式(单例模式)相关的知识,希望对你有一定的参考价值。

  1、单例定义及要素

  定义:

  保证一个类只有一个实例存在,同时提供能对该实例加以访问的全局访问方法(GoF中单例模式的定义)。

  要素:

  (1)某个类只能有一个实例

  (2)必须自行创建这个实例

  (3)必须自行向整个系统提供这个实例

  2、模式中的角色和职责

  Singleton(单例)在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个Singleton类型的静态对象,作为外部共享的唯一实例。

  使用步骤:

  (1)构造函数私有化

  (2)提供一个全局的静态方法来获取单例对象

  (3) 在类中定义一个静态指针,只想本类的变量

  3、单例模式的优缺点

优点
(1) 单例模式提供了对唯一实例的受控访问。
(2) 节约系统资源。 由于在系统内存中只存在一个对象。
缺点
(1) 扩展略难。 单例模式中没有抽象层。
(2) 单例类的职责过重。

  4、适用场景

(1) 系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源管理器,或者需要考虑资源消耗太大而只允许创建一个对象。

(2) 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。 

5、实例

 

技术分享
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 /*
 6     懒汉模式:在调用全局静态方法获取单例时,再进行创建。该模式下单例的创建是在程序运行中进行
 7 */
 8 class Singleton
 9 {
10 public:
11     //对外提供一个全局的静态方法
12     static Singleton *getInstance()
13     {
14         if (instance == NULL)
15             instance = new Singleton;
16         m_count++;
17         return instance;
18     }
19 
20     int getCount()
21     {
22         return m_count;
23     }
24 
25 private:
26     //私有化构造函数
27     Singleton()
28     {
29         instance = NULL;
30         m_count = 0;
31         cout << "Singleton() running" << endl;
32     }
33     //在类中定义一个静态指针,指向本类的变量
34     static Singleton *instance;
35     static int m_count;
36 };
37 //静态变量的初始化要放在全局位置上
38 Singleton *Singleton::instance = NULL;
39 int Singleton::m_count = 0;
40 
41 
42 /*
43     饿汉模式:实例的创建是在声明的时候创建的,即在编译的时候就已创建
44 */
45 class Singleton2
46 {
47 public:
48     static    Singleton2*    getInstance() {
49         m_count++;
50         return    instance;
51     }
52     int    getCount() {
53         return    m_count;
54     }
55 private:
56     Singleton2() {
57         instance = NULL;
58         m_count = 0;
59     }
60     static    Singleton2    *    instance;
61     static int    m_count;
62 };
63 
64 Singleton2 *Singleton2::instance = new Singleton2;
65 int Singleton2::m_count = 0;
66 
67 int main(int argc, char* argv[])
68 {
69     cout << "----------        以下 是 懒汉式    ------------" << endl;
70     Singleton *single = Singleton::getInstance();
71     cout << single->getCount() << endl;
72     Singleton *single2 = Singleton::getInstance();
73     cout << single2->getCount() << endl;
74 
75     if (single == single2)
76         cout << "相同" << endl;
77     else
78         cout << "不同" << endl;
79 
80     cout << "----------        以下 是 饿汉式    ------------" << endl;
81     Singleton2    *    singer3 = Singleton2::getInstance();
82     cout << singer3->getCount() << endl;
83     Singleton2    *    singer4 = Singleton2::getInstance();
84     cout << singer4->getCount() << endl;
85     if (singer3 == singer4)
86         cout << "相同" << endl;
87     else
88         cout << "不同" << endl;
89 
90     getchar();
91     return 0;
92 }
View Code

 

 

 

 








以上是关于添砖加瓦:设计模式(单例模式)的主要内容,如果未能解决你的问题,请参考以下文章

添砖加瓦:设计模式(总述)

添砖加瓦:设计模式(工厂方法模式)

浅谈责任链设计模式在框架源码中的运用

常用代码片段

常用代码片段

性能比较好的单例写法