1. 程式人生 > 實用技巧 >【介面】介面的概念 介面和抽象類的區別

【介面】介面的概念 介面和抽象類的區別

技術標籤:設計模式設計模式c++單例模式

單例模式

保證一個類,只有一個例項存在,同時提供能對例項加以訪問的全域性訪問方法。

Singleton(單例):在單例類的內部實現只生成一個例項,同時它提供一個靜態的getInstance()工廠方法,讓客戶可以訪問它的唯一例項;為了防止在外部對其例項化,將其建構函式設計為私有;在單例類內部定義了一個Singleton型別的靜態物件,作為外部共享的唯一例項。

直接上程式碼:

// singleten.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include <iostream>
#include <mutex> 
using namespace std;

//單利模式 餓漢式
class Singleten
{
public:
	static Singleten* getInstance()
	{
		return instance;
	}
private:
	Singleten()  //防止private中可以防止別的來建立一個新的例項
	{}
	static Singleten * instance;  //指向本類的唯一的例項的指標
};

/*
餓漢式  - 在編譯期間就已經確定這個唯一的例項了。
*/
Singleten * Singleten::instance = new Singleten;  //在外邊唯一的一個單利


//單利模式2  懶漢式

class Singleten2
{
public:
	static Singleten2 * getInstance()
	{
		//lock_guard<mutex> lock(mMutex);
		//加鎖模式防止多執行緒建立時候問題。
		mMutex.lock();  //加鎖
		if (instance == NULL)
		{
			instance = new Singleten2; //這裡建立
		}
		mMutex.unlock();  //解鎖
		return instance;
	}
private:
	Singleten2()
	{

	}
	static Singleten2* instance; //指向本類的唯一的例項的指標
	static mutex mMutex;
};
mutex Singleten2::mMutex;


//懶漢式
Singleten2 * Singleten2::instance = NULL; 


int main()
{
	Singleten * ins1 = Singleten::getInstance();
	Singleten * ins2 = Singleten::getInstance();
	if (ins1 == ins2)
	{
		cout << "是同一個指標" << endl;
	}
	else
	{
		cout << "不是同一個指標" << endl;
	}

	Singleten2 * ins3 = Singleten2::getInstance();
	Singleten2 * ins4 = Singleten2::getInstance();

	if (ins3 == ins4)
	{
		cout << "是同一個指標" << endl;
	}
	else
	{
		cout << "不是同一個指標" << endl;
	}
    return 0;
}

首先,我們在private中提供建構函式:

private:
	Singleten()  //防止private中可以防止別的來建立一個新的例項
	{}

其目的,防止別人是用這個類 new 一個物件。

我們使用,靜態 建立一個物件,然後在類外初始化,這樣就只有一份啦。

 static Singleten * instance;

上面提供了兩個方式,一個是

餓漢式:在編譯期間就已經確定這個唯一的例項了。

另一個是

懶漢式:當呼叫指標的時候,才開始建立。

每個方法都有利弊:

餓漢式 :程式類一開始就初始化了,若你提供的程式中,沒能使用該單例的類,這樣就相當於浪費了這個空間。優點是,使用時候,別的訪問就不衝突。

懶漢式: 程式類不初始化,使用的時候就初始化了,但是在多執行緒就非常危險了,必須要加上鎖的方式,來確定唯一性,不然,會在建立的時候會執行兩個new,然後導致了,記憶體的洩漏。優點是加上鎖後,可以使用的時候才建立空間,不使用時候節省了空間,但是會存在鎖類的空間。

有關兩種方式,可根據專案情況,選擇其中的一種,就好。

單例模式的優缺點:

優點:
(1) 單例模式提供了對唯一例項的受控訪問。
(2) 節約系統資源。 由於在系統記憶體中只存在一個物件。
缺點:
(1) 擴充套件略難。 單例模式中沒有抽象層。
(2) 單例類的職責過重。

本例子十分簡單,希望能對你有幫助。喜歡就給我部落格點個贊吧。