
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供魏縣企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計、網(wǎng)站制作、H5開發(fā)、小程序制作等業(yè)務(wù)。10年已為魏縣眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進行中。
1、單例模式
(1)需求的提出:在架構(gòu)設(shè)計時,某些類在整個系統(tǒng)生命周期中最多只能有一個對象存在(Single,Instance)
(2)問題:如何定義一個類,使得這個類最多只能創(chuàng)建一個對象?
要控制類的對象數(shù)目,必須對外隱藏構(gòu)造函數(shù)
思路:
@1:將構(gòu)造函數(shù)的訪問屬性設(shè)置為private,將拷貝構(gòu)造函數(shù),賦值操作符都聲明成private的,防止對象的賦值操作,因為這個類的對象只能有一個。
@2:定義instance并初始化為NULL。在類中用static type* instance的方式聲明一個靜態(tài)的變量,按照對這個static修飾的訪問規(guī)則,之后在類外面進行定義初始化為NULL。
@3:然后在類中在提供一個static的成員函數(shù),用來創(chuàng)建對象的,當我們要創(chuàng)建對象的時候,必然會用調(diào)用這個函數(shù),這個函數(shù)內(nèi)部就會去訪問instance。@4:訪問instance的值,空值時:創(chuàng)建對象,并用instance進行標記(也就是如果instance為NULL,則直接new一個對象出來將地址賦值給
instance,讓instance進行標記),然后返回這個對象。非空值時:直接返回instance標記的對象。這樣就保證了這個類只能創(chuàng)建一個對象,這就是單例模式。‘
單例模式的對象在整個系統(tǒng)的運行過程當中是絕對不需要釋放的,當系統(tǒng)結(jié)束運行時,系統(tǒng)自然就會釋放這個對象了。所以單例模式的對象不需要在系統(tǒng)運行的時候,也就是不需要在系統(tǒng)生命周期
還沒有結(jié)束時進行釋放。
例:單例模式
#include <iostream>
using namespace std;
/*
*單例模式
*why2016/9/6
*
*實現(xiàn)單例模式的思路:
*
*@1:將構(gòu)造函數(shù)的訪問屬性設(shè)置為private,將拷貝構(gòu)造函數(shù),賦值操作符都聲明成private的,防止對象的賦值操作,因為這個類的對象只能有一個。
*@2:定義instance并初始化為NULL。在類中用static type* instance的方式聲明一個靜態(tài)的變量,按照對這個static修飾的訪問規(guī)則,之后在類外面進行定義初始化為NULL。
*@3:然后在類中在提供一個static的成員函數(shù),用來創(chuàng)建對象的,當我們要創(chuàng)建對象的時候,必然會用調(diào)用這個函數(shù),這個函數(shù)內(nèi)部就會去訪問instance。
*@4:訪問instance的值,空值時:創(chuàng)建對象,并用instance進行標記(也就是如果instance為NULL,則直接new一個對象出來將地址賦值給
*instance,讓instance進行標記),然后返回這個對象。非空值時:直接返回instance標記的對象。這樣就保證了這個類只能創(chuàng)建一個對象,這就是單例模式。‘
*/
/*
*單例模式的對象在整個系統(tǒng)的運行過程當中是絕對不需要釋放的,當系統(tǒng)結(jié)束運行時,系統(tǒng)自然就會釋放這個對象了。所以單例模式的對象不需要在系統(tǒng)運行的時候,
*也就是不需要在系統(tǒng)生命周期還沒有結(jié)束時進行釋放。
*/
class SObject
{
private:
SObject()//將構(gòu)造函數(shù)隱藏起來
{
}
SObject(const SObject&);//將拷貝構(gòu)造函數(shù)隱藏起來
SObject& operator = (const SObject&); //將賦值操縱隱藏起來
static SObject *c_instance; //聲明一個instance的SObject的指針,將來用來標記創(chuàng)建的對象的,也是指向那個對象的指針。因為是static的,所以需要在外部進行定義,初始化為NULL
public:
static SObject* GetInstance();//聲明,用來創(chuàng)建一個對象的,因為你的構(gòu)造函數(shù)已經(jīng)為private的,所以我們要自己提供一個。因為static的,所以也要在外部進行定義
void print()
{
cout << "this = " << this << endl;
}
};
SObject* SObject::c_instance = NULL;
SObject* SObject::GetInstance()
{
if (c_instance == NULL)
{
c_instance = new SObject();//如果c_instance這個標記為空,說明沒有對象創(chuàng)建,則創(chuàng)建唯一一個對象
}
return c_instance;//返回這個創(chuàng)建的對象的指針
}
int main(void)
{
SObject* s1 = SObject::GetInstance();
SObject* s2 = SObject::GetInstance();
s1->print();//this = 0x893d008
s2->print();//this = 0x893d008 //說明確實只能創(chuàng)建一個對象,因為兩個指針指向的都是一個對象
return 0;
}
2、上面的代碼實現(xiàn)了單例模式,但是還不是很完美,比如需要定義靜態(tài)變量c_instance,必須要定義靜態(tài)成員函數(shù)GetIntance(),所以我們可以在完美一下。
解決方案就是:將單例模式相關(guān)的代碼抽取出來,就是單例模式本身的邏輯模式那部分,不影響類的其他功能,將這部分代碼拿出來后開發(fā)出單例類模板。當需要單例類時,直接使用單例類模板。
使用方式是,在需要使用單例類模式的類中,用友元關(guān)鍵friend + class + 單例類模板的名字<當前類的名字>,將單例類模板聲明為當前類的友元。在單例類模板中實現(xiàn)的是定義靜態(tài)變量用來
標記對象,和定義靜態(tài)成員函數(shù)來實現(xiàn)判斷標記從而決定是否創(chuàng)建新的對象和返回對象的地址。
Singleton英文是單例模式的意思。
3、好的使用單例模式類的例子:
/************************************************單例類模板程序*****************************************/
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
/*
*單例類模板
*實現(xiàn)單例模式的邏輯那部分。以后其他的類如果想用單例模式都可以添加將這個單例類模板聲明為友元,T是使用該模板的類名,進行實現(xiàn)單例模式
*/
template
< typename T >
class Singleton
{
private:
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)//看是否使用單例模式的類已經(jīng)定義過對象了。
{
c_instance = new T();//沒有定義對象,則創(chuàng)建一個對象//沒有定義對象,則創(chuàng)建一個對象
}
return c_instance; //最后返回這個對象的指針,這個標記就記錄著這個對象的地址。這樣防止對象對此定義。
}
#endif
/*************************************************使用這個單例類模板而實現(xiàn)的單例模式的類*******************************/
#include <iostream>
#include "Singleton.h"
using namespace std;
/*
*SObject使用單例模式,方式是使用的添加單例類模板進行實現(xiàn)的
*
*
*/
//同時必須要將一些跟對象的創(chuàng)建有關(guān)的函數(shù)弄成private的,隱藏起來。包括:構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、賦值操作符重載函數(shù)
class SObject
{
private:
friend class Singleton<SObject>;//將使用的單例類模板聲明為當前這個類的友元。這樣即可達到使用單例類模板。
SObject()
{
}
SObject(const SObject&);
SObject& operator = (const SObject&);
public:
void print()
{
cout << "this = " << this << endl;
}
};
int main(void)
{
SObject *s1 = Singleton<SObject>::GetInstance();
SObject *s2 = Singleton<SObject>::GetInstance();
SObject *s3 = Singleton<SObject>::GetInstance();
s1->print();//會發(fā)現(xiàn)三個的指針值都是一樣,說明都是指向的同一個對象,說明單例模式實現(xiàn)成功,單例模式下的類只能創(chuàng)建一個對象
s2->print();
s3->print();
return 0;
}
網(wǎng)頁名稱:C++單例模式與單例類模板
網(wǎng)頁URL:http://www.chinadenli.net/article20/pgccco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、微信小程序、用戶體驗、搜索引擎優(yōu)化、網(wǎng)站策劃、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)