1. 程式人生 > >設計模式之單例模式(懶漢式和餓漢式)

設計模式之單例模式(懶漢式和餓漢式)

設計模式第一個模式通常是單例模式,是為了防止某個類存在多個物件。
程式碼如下:

**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++中的建構函式簡單來說分兩步:
第一步:記憶體分配
第二步:初始化成員變數
由於多執行緒的關係,可能當我們在分配記憶體好了以後,還沒來得急初始化成員變數,就進行執行緒切換,另外一個執行緒拿到所有權後,由於記憶體已經分配了,但是變數初始化還沒進行,因此列印成員變數的相關值會發生不一致現象。

`