設計模式之單例模式(懶漢式和餓漢式)
阿新 • • 發佈:2019-01-23
設計模式第一個模式通常是單例模式,是為了防止某個類存在多個物件。
程式碼如下:
**singlon.h:**
#pragma once
#ifndef _SINGLON_H
#define _SINGLON_H
class singlon
{
public:
static singlon *GetInstance();
static singlon *FreeInstance();
int count;
private:
static singlon *m_psl;
singlon();
};
#endif
**singlon.cpp:**(懶漢式)
#include "stdafx.h"
#include "singlon.h"
singlon *singlon::GetInstance()
{
if (m_psl == nullptr)
{
m_psl = new singlon;//懶漢式
}
return m_psl;
}
singlon *singlon::FreeInstance()
{
if (m_psl != nullptr)
{
delete m_psl;
m_psl = nullptr;
}
return m_psl;
}
singlon::singlon()
{
cout << "singlon 建構函式" << endl;
}
singlon *singlon::m_psl = nullptr;//類的靜態成員變數是需要在類外初始化的,不能在.h裡哦
**singlon.cpp:**(餓漢式)
singlon *singlon::GetInstance()
{
return m_psl;
}
singlon *singlon::m_psl = new singlon; //餓漢式
//直接在.cpp方法的外面new出來singlon *物件;GetInstance()直接返回即可
//1”懶漢”模式雖然有優點,但是每次呼叫GetInstance()靜態方法時,必須判斷
// NULL == m_instance,使程式相對開銷增大。
//2多執行緒中會導致多個例項的產生,從而導致執行程式碼不正確以及記憶體的洩露。
//3提供釋放資源的函式
討論: 這是因為C++中建構函式並不是執行緒安全的。
C++中的建構函式簡單來說分兩步:
第一步:記憶體分配
第二步:初始化成員變數
由於多執行緒的關係,可能當我們在分配記憶體好了以後,還沒來得急初始化成員變數,就進行執行緒切換,另外一個執行緒拿到所有權後,由於記憶體已經分配了,但是變數初始化還沒進行,因此列印成員變數的相關值會發生不一致現象。
`