C++实现单例模式

简介:

什么是单例模式

单件模式(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奶酪博客园博客,原文链接:http://www.cnblogs.com/CheeseZH/p/5264519.html,如需转载请自行联系原作者

相关文章
|
6月前
|
设计模式 安全 测试技术
【C++】—— 单例模式详解
【C++】—— 单例模式详解
|
5月前
|
设计模式 安全 Java
单例模式分享
单例模式分享
22 0
|
设计模式 安全 编译器
2023-6-12-第三式单例模式
2023-6-12-第三式单例模式
72 0
|
6月前
|
C++
【C++ 单例模式】
【C++ 单例模式】
|
6月前
|
设计模式 安全
【单例模式】—— 每天一点小知识
【单例模式】—— 每天一点小知识
|
安全 Java
原来要这么实现单例模式
原来要这么实现单例模式
55 0
|
设计模式 缓存 JSON
没那么简单的单例模式
没那么简单的单例模式
125 0
没那么简单的单例模式
|
存储 安全 调度
单例模式的简单介绍
单例模式的简单介绍
|
设计模式 安全 Java
回顾一下单例模式
回顾一下单例模式
|
设计模式 缓存
我学会了,单例模式
单例模式属于创建型模式,这个类型的设计模式是将 对象的创建和使用解耦了,花式的去创建对象。
126 0
我学会了,单例模式