標籤:class blog java get 使用 資料
一、概述
/*
一般情況下,我們建立的一些類是屬於工具性質的,基本不用儲存太多的跟自身有關的資料,在這種情況下,每次都去new一個對象,即增加了開銷,也使得代碼更加臃腫。
其實,我們只需要一個執行個體對象就可以。如果採用全域或者靜態變數的方式,會影響封裝性,難以保證別的代碼不會對全域變數造成影響。
考慮到這些需要,我們將預設的建構函式聲明為私人的,這樣就不會被外部所new了,甚至可以將解構函式也聲明為私人的,這樣就只有自己能夠刪除自己了。
在Java和C#這樣純的物件導向的語言中,單例模式非常好實現,直接就可以在靜態區初始化instance,然後通過getInstance返回,這種就被稱為餓漢式單例類。
也有些寫法是在getInstance中new instance然後返回,這種就被稱為懶漢式單例類,但這涉及到第一次getInstance的一個判斷問題。
單例模式常常與原廠模式結合使用,因為工廠只需要建立產品執行個體就可以了,在多線程的環境下也不會造成任何的衝突,因此只需要一個工廠執行個體就可以了。
*/
/*
@單件模式: Singleton
一) 特點
1) 最為簡單,最為常見,最容易實現,最應該熟悉和掌握。相當於面向過程中的全域變數(對象)
2) 通過一個static成員變數來記錄這一個唯一的對象執行個體,通過一個static成員介面獲得這個唯一的執行個體。
3) Singleton不可以被執行個體化,因此其建構函式應該聲明為protected或private
二)優缺點:
優點
1.減少了時間和空間的開銷(new執行個體的開銷)。
2.提高了封裝性,使得外部不易改動執行個體。
缺點
1.懶漢式是以時間換空間的方式。
2.餓漢式是以空間換時間的方式。
*/
二、類圖
三、代碼
Singleton.h
#pragma once#include <iostream>using namespace std;class Singleton{public: static Singleton *GetInstance();private:static Singleton *m_sInstance;private:/* * @brief Singleton不可以被樣本化,所以將建構函式聲明為protected或者private。 */ Singleton();~Singleton();};
Singleton.cpp
#include "Singleton.h"#include "stdio.h"Singleton::Singleton(){ cout<<__FUNCTION__<<endl;}Singleton::~Singleton(){cout<<__FUNCTION__<<endl;}Singleton* Singleton::m_sInstance = NULL;Singleton *Singleton::GetInstance(){ if ( NULL == m_sInstance ) { m_sInstance = new Singleton(); } return m_sInstance;}
main.cpp
#include "Singleton.h"#include <iostream>using namespace std;int main(int argc, char *argv[]){ Singleton *sgn1 = Singleton::GetInstance();Singleton *sgn2 = Singleton::GetInstance();if (sgn1 == sgn2 ){printf("sgn1==sgn2\n");} return 0;}
四、運行結果
Singleton::Singleton
sgn1==sgn2
請按任意鍵繼續. . .