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 }
找我内推: 字节跳动各种岗位
作者:
ZH奶酪(张贺)
邮箱:
cheesezh@qq.com
出处:
http://www.cnblogs.com/CheeseZH/
*
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。