c++中的单例模式

今天正好看了一节c++的网课(其实就课件和代码),就记录一下。

所谓单例模式是指一个类只允许有一个实例,虽然这是设计模式里比较重要的一个概念,但是由于接触工业产品较少,所以概念也是很模糊的。

简而言之,设计的思路就是把类的构造函数声明为private,然后提供一个公共的接口是外部能够访问到类的实例

#ifndef _SINGLETON_H_
#define _SINGLETON_H_
using namespace std;
class SingleTon
{

public:
    static SingleTon* GetInstance()
    {
        if(mp == NULL)
            mp = new SingleTon();
        return mp;
    }
    void print_this()
    {
        cout<<"address:"<<this<<endl;
    }
private:
    static SingleTon* mp;
    SingleTon(){};
    SingleTon(const SingleTon&){};
    SingleTon operator =(const SingleTon&){};
};

SingleTon* SingleTon::mp = NULL;
#endif

  

#include <iostream>
#include "SingleTon.h"

int main(int argc, char const *argv[])
{
	SingleTon* t1 = SingleTon::GetInstance();
	SingleTon* t2 = SingleTon::GetInstance();
	t1->print_this();
	t2->print_this();
	return 0;
}

  代码写的比较渣,总之就是给一个可以访问的指针,只分配一次内存。

然后又看见一种定义模板类来实现单例的方法,这种方法就是将单例模式的类都同一抽象定义为模板类,后面要用到的类都可以直接套用

#ifndef _SINGLETON_H_
#define _SINGLETON_H_

template
< typename T >
class Singleton
{
    static T* c_instance;
public:
    static T* GetInstance();
};

template
< typename T >
T* Singleton<T>::c_instance = NULL;

template
< typename T >
T* Singleton<T>::GetInstance()
{
    if( c_instance == NULL )
    {
        c_instance = new T();
    }
    
    return c_instance;
}


#endif

  

#include <iostream>
#include <string>
#include "Singleton.h"

using namespace std;

class SObject
{
    friend class Singleton<SObject>;   //该类使用到单例 
    
    SObject(const SObject&);
    SObject& operator= (const SObject&);
    
    SObject()
    {
    }
public:
    
    void print()
    {
        cout << "this = " << this << endl;
    }
};

int main()
{
    SObject* s = Singleton<SObject>::GetInstance();
    SObject* s1 = Singleton<SObject>::GetInstance();
    SObject* s2 = Singleton<SObject>::GetInstance();
    
    s->print();
    s1->print();
    s2->print();
    
    return 0;
}
View Code

说实话,下面这个代码看起来也好看,思路也更清晰,扩展性强,模板真好用。

posted @ 2019-04-19 20:20  快乐的打字员~  阅读(655)  评论(0编辑  收藏  举报