• 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 }
  • 相关阅读:
    题解 P4111 [HEOI2015]小 Z 的房间
    题解 P3317 [SDOI2014]重建
    题解 P4336 [SHOI2016]黑暗前的幻想乡
    NOIP 模拟 7 考试总结
    NOIP 模拟 7 回家
    NOIP 模拟 7 寿司
    MySQL: 多表查询
    MySQL:设计演员与角色表(多对多)
    MySQL:设计省&市表 (一对多)
    MySQL:多表关系设计(一对多 / 多对多 / 一对一)
  • 原文地址:https://www.cnblogs.com/CheeseZH/p/5264519.html
Copyright © 2020-2023  润新知