C++实现单例模式

昨天面试的时候,面试官让我用C++或Java实现一个单例模式。

因为设计模式是在12年的时候学习过这门课,而且当时觉得这门课很有意思,所以就把课本读了几遍,所以印象比较深刻,但是因为实际编程中很少注意使用,所以没能编码实现。

这是之前用C#写的一个单例模式的文章:http://www.cnblogs.com/CheeseZH/archive/2012/05/14/2500546.html

什么是单例模式

单件模式(SingletonPattern):确保一个类只有一个实例,并提供一个全局访问点。和全局变量一样方便,又没有全局变量的缺点,即不需要从一开始就创建对象,而是在需要时才创建它。

那么要如何保证一个类只能被实例化一次呢?一般情况下,如果存在一个类,我们都是可以多次地实例化它的。那么如果这样呢:

1 public MyClass{
2     private MyClass(){
3     }
4 }

咦?构造函数私有?含有私有的构造器的类应该是不能被其他类实例化的,因为只有MyClass内部的代码才能调用这个私有的构造函数。虽然只有MyClass类的实例才能调用MyClass构造器,但在这之前,必须有一个MyClass实例。然而这个类又不能被实例化,这样就产生了矛盾!

看下面这段代码:

1 public MyClass{
2     public static MyClass getInstance(){
3     }
4 }

上面的代码表示MyClass有一个静态方法,我们可以这样调用这个方法:MyClass.getInstance(); 因为getInstance()是一个静态方法,换句话说,是一个“类”方法。引用一个静态方法,你需要使用类名,而不是对象名。

那么把上面两段代码合在一起,是否就可以使MyClass只产生一个实例了呢?

看下面的代码:

 1 public class MyClass{
 2        //利用一个静态变量来记录MyClass类的唯一实例
 3        private static MyClass uniqueInstance;
 4        //私有构造函数,只有自MyClass类内才可以调用
 5        private MyClass() {}
 6        //用getInstance静态方法实例化对象,并返回
 7        public static MyClass getInstance(){
 8                 if(uniqueInstance == NULL)
 9                 {
10                       uniqueInstance = new MyClass();
11                 }
12                 return uniqueInstance;
13        }
14        //当然,单件类也是一个正常的类,具有其他的变量和方法
15        //...
16 }

这就是一个经典的单件模式的实现!之所以实例唯一,是因为单件类没有公开的构造器,其他类不能自行将其实例化得到一个实例,而必须通过它的静态方法getInstance()去创建一个实例。

C++完整实现

Singleton.h

 1 #pragma once
 2 
 3 class Singleton{
 4 private:
 5     Singleton();
 6     ~Singleton();
 7     static Singleton* uniqueInstance;
 8 
 9 public:
10     static Singleton* getInstance();
11     // other methods...
12 };

Singleton.cpp

 1 #include"Singleton.h"
 2 #include<iostream>
 3 using namespace std;
 4 
 5 Singleton::Singleton(){
 6 
 7 }
 8 
 9 Singleton::~Singleton(){
10     if(uniqueInstance == NULL){
11         return;
12     }
13     delete uniqueInstance;
14     uniqueInstance = 0;
15 }
16 
17 Singleton* Singleton::getInstance(){
18     if(uniqueInstance == NULL){
19         uniqueInstance = new Singleton;
20     }
21     return uniqueInstance;
22 }

main.cpp

 1 #include<iostream>
 2 #include"Singleton.h"
 3 using namespace std;
 4 
 5 Singleton* Singleton::uniqueInstance = NULL;
 6 
 7 int main(){
 8     Singleton* singleton1 = Singleton::getInstance();
 9     Singleton* singleton2 = Singleton::getInstance();
10     if(singleton1 == singleton2){
11         cout<<"Got same singleton!!"<<endl;
12     }
13     else{
14         cout<<"Oh,no!got a different singleton!!"<<endl;
15     }
16     return 0;
17 }

 一个完整的单例模式代码:

 1 #include<iostream>
 2 using namespace std;
 3 class CSingleton
 4 {
 5 private:
 6     CSingleton() {
 7     }
 8     ~CSingleton() {
 9         if (m_pInstance == NULL) {
10             return;
11         }
12         delete m_pInstance;
13         m_pInstance = NULL;
14     }
15     static CSingleton *m_pInstance;
16 public:
17     static CSingleton * GetInstance() {
18         if(m_pInstance == NULL)
19             m_pInstance = new CSingleton();
20         return m_pInstance;
21     }
22 };
23 CSingleton* CSingleton::m_pInstance = NULL;//类的静态成员变量需要在类外边初始化
24 
25 int main() {
26 
27     CSingleton* single1 = CSingleton::GetInstance();
28     CSingleton* single2 = CSingleton::GetInstance();
29 
30     if (single1 == single2) {
31         cout<<"Same"<<endl;
32     }
33     return 0;
34 }

 

posted @ 2016-03-11 10:15  ZH奶酪  阅读(8967)  评论(0编辑  收藏  举报