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,如需转载请自行联系原作者

相关文章
|
2月前
|
C++
C++单例模式
C++中使用模板实现单例模式的方法,并通过一个具体的类A示例展示了如何创建和使用单例。
35 2
|
7月前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
59 0
|
4月前
|
安全 C++
C++ QT 单例模式
C++ QT 单例模式
84 0
|
4月前
|
设计模式 安全 IDE
C++从静态类型到单例模式
C++从静态类型到单例模式
40 0
|
5月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
70 2
|
6月前
|
设计模式 存储 缓存
C++ -- 单例模式
**摘要:** 单例模式确保一个类仅有一个实例,并提供全局访问点。为了实现单例,构造函数通常设为私有,通过静态成员函数来创建和返回实例。两种常见实现是饿汉模式(在类加载时创建实例,线程安全但可能导致不必要的内存占用)和懒汉模式(首次使用时创建,可能需线程同步)。拷贝构造函数和赋值运算符通常被禁用来防止额外实例的创建。单例模式适用于资源管理、缓存和线程池等场景。在C++中,静态成员变量和函数用于存储和访问单例实例,保证其生命周期与程序相同。
|
7月前
|
安全 程序员 C语言
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(下)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
61 5
|
7月前
|
设计模式 编译器 Linux
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(中)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
49 0
|
7月前
|
安全 编译器 C语言
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(上)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
46 0
|
7月前
|
设计模式 Java C++
【C++高阶(八)】单例模式&特殊类的设计
【C++高阶(八)】单例模式&特殊类的设计