1. 程式人生 > >C++筆記 第六十二課 單例類模板---狄泰學院

C++筆記 第六十二課 單例類模板---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux

第六十二課 單例類模板

1.單例模式

需求的提出
在構造設計時,某些類在整個系統生命期中最多隻能有一個物件存在(Single Instance).

2.問題

如何定義一個類,使得這個類最多隻能建立一個物件?單例模式

3.單例模式

要控制類的物件數目,必須對外隱藏建構函式
思路:
將建構函式的訪問屬性設定為private(外界無法建立物件)
定義instance並初始化為NULL
當需要使用物件時,訪問instance的值
空值:建立物件,並用instance標記
非空值:返回instance標記的物件

62-1 單例模式初探

#include <iostream>
#include <string>
using namespace std;
class SObject
{
//1.為建立唯一物件,將建立物件各種途徑私有化,外界無法建立物件
static SObject* c_instance; //2.設計個標誌用來標記物件,標記為靜態成員變數    
SObject(const SObject&);//拷貝建構函式
SObject& operator = (const SObject&);//賦值操作符
SObject()//建構函式
    {
    }
public:
    static SObject* GetInstance();//4.定義靜態成員函式用於提供唯一建立物件途徑
    void print()
    {
	cout << "this = " << this << endl;
    }
};
SObject* SObject::c_instance = NULL; //3.在定義靜態成員變數時,將這個靜態變數設定為空
SObject* SObject::GetInstance()
//8.如果再次建立物件時,仍需要用這個靜態函式來建立,如果有一個,則進行第7步
{
    if(c_instance == NULL) //5.首先看下標記是否為空,如果一個物件都沒有,則可以建立一個物件
    {
	c_instance = new SObject();//6.建立完成後,用這個唯一的標記來標記物件
}
return c_instance;//7.將此物件返回
}
int main()
{
    SObject* s = SObject::GetInstance();
    SObject* s1 = SObject::GetInstance();
    SObject* s2 = SObject::GetInstance();
    
    s->print();
    s1->print();
    s2->print();
    return 0;
}
執行結果
this = 0x14ffc20
this = 0x14ffc20
this = 0x14ffc20

存在的問題
需要使用單例模式時:
必須定義靜態成員變數c_instance
必須定義靜態成員函式GetInstance()
解決方案
將單例模式相關的程式碼抽取出來,開發單例類模板。當需要單例類時,直接使用單例類模板。

62-2 單例類模板

Singleton.h
#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
62-2.cpp
#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;
}
執行結果
this = 0xa60c20
this = 0xa60c20
this = 0xa60c20

小結
單例模式是開發中最常用的設計模式之一
單例模式的應用使得一個類最多隻有一個物件
可以將單例模式相關的程式碼抽象成類模板
需要使用單例模式的類直接使用單例模板