1. 程式人生 > >創建型模式 單例模式

創建型模式 單例模式

pri com 創建型模式 私有 變量 模式 靜態 分享 靜態方法

創建型模式 單例模式

/**
 * 創建型模式 單例模式 懶漢式
 * GoF對單例模式的定義是:保證一個類、只有一個實例存在,同時提供能對該實例加以訪問的全局訪問方法。
 *
 * 實現單例步驟常用步驟
 * a) 構造函數私有化
 * b) 提供一個全局的靜態方法(全局訪問點)
 * c) 在類中定義一個靜態指針,指向本類的變量的靜態變量指針
 *
 */

#include <iostream>

class Singelton
{
private:
    static Singelton * m_pls;

    Singelton() // 構造函數不是線程安全函數
    {
        std::cout 
<< "Singelton 構造函數執行" << std::endl; } public: static Singelton *getInstance() { if (m_pls == nullptr) // 只有在使用的時候,才去創建對象。 1 每次獲取實例都要判斷 2 多線程會有問題 { m_pls = new Singelton; } return m_pls; } static Singelton *FreeInstance() {
if (m_pls != nullptr) { delete m_pls; m_pls = nullptr; } return m_pls; } }; Singelton * Singelton::m_pls = nullptr; void mytest() { Singelton * p1 = Singelton::getInstance(); Singelton * p2 = Singelton::getInstance(); if (p1 == p2) { std::cout
<< "是同一個對象" << std::endl; } else { std::cout << "不是同一個對象" << std::endl; } Singelton::FreeInstance(); return; } int main() { mytest(); system("pause"); return 0; }

/**
 * 創建型模式 單例模式 餓漢式
 * GoF對單例模式的定義是:保證一個類、只有一個實例存在,同時提供能對該實例加以訪問的全局訪問方法。
 *
 * 實現單例步驟常用步驟
 * a) 構造函數私有化
 * b) 提供一個全局的靜態方法(全局訪問點)
 * c) 在類中定義一個靜態指針,指向本類的變量的靜態變量指針
 *
 */

#include <iostream>

class Singelton
{
private:
    static Singelton * m_pls;

    Singelton() 
    {
        std::cout << "Singelton 構造函數執行" << std::endl;
    }
public:
    static Singelton *getInstance()
    {
        return m_pls;
    }

    static Singelton *FreeInstance()
    {
        if (m_pls != nullptr)
        {
            delete m_pls;
            m_pls = nullptr;
        }
        return m_pls;
    }
};

// 餓漢式
// 不管你創建不創建實例,均把實例new出來
Singelton * Singelton::m_pls = new Singelton;


void mytest()
{
    Singelton * p1 = Singelton::getInstance();
    Singelton * p2 = Singelton::getInstance();
    if (p1 == p2)
    {
        std::cout << "是同一個對象" << std::endl;
    }
    else
    {
        std::cout << "不是同一個對象" << std::endl;
    }
    Singelton::FreeInstance();

    return;
}


int main()
{
    mytest();

    system("pause");
    return 0;
}

技術分享

創建型模式 單例模式