日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

单例模式及C++实现代码

發布時間:2023/11/30 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单例模式及C++实现代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.cnblogs.com/cxjchen/p/3148582.html

單例模式

單例模式,可以說設計模式中最常應用的一種模式了,據說也是面試官最喜歡的題目。但是如果沒有學過設計模式的人,可能不會想到要去應用單例模式,面對單例模式適用的情況,可能會優先考慮使用全局或者靜態變量的方式,這樣比較簡單,也是沒學過設計模式的人所能想到的最簡單的方式了。

一般情況下,我們建立的一些類是屬于工具性質的,基本不用存儲太多的跟自身有關的數據,在這種情況下,每次都去new一個對象,即增加了開銷,也使得代碼更加臃腫。其實,我們只需要一個實例對象就可以。如果采用全局或者靜態變量的方式,會影響封裝性,難以保證別的代碼不會對全局變量造成影響。

考慮到這些需要,我們將默認的構造函數聲明為私有的,這樣就不會被外部所new了,甚至可以將析構函數也聲明為私有的,這樣就只有自己能夠刪除自己了。在Java和C#這樣純的面向對象的語言中,單例模式非常好實現,直接就可以在靜態區初始化instance,然后通過getInstance返回,這種就被稱為餓漢式單例類。也有些寫法是在getInstance中new instance然后返回,這種就被稱為懶漢式單例類,但這涉及到第一次getInstance的一個判斷問題。

下面的代碼只是表示一下,跟具體哪種語言沒有關系。

單線程中:

1 2 3 4 5 6 7 Singleton* getInstance() { ????if?(instance == NULL) ????????instance =?new?Singleton(); ????return?instance; }
這樣就可以了,保證只取得了一個實例。但是在多線程的環境下卻不行了,因為很可能兩個線程同時運行到if (instance == NULL)這一句,導致可能會產生兩個實例。于是就要在代碼中加鎖。 Singleton* getInstance() {lock();if (instance == NULL){instance = new Singleton();}unlock();return instance; } 但這樣寫的話,會稍稍映像性能,因為每次判斷是否為空都需要被鎖定,如果有很多線程的話,就愛會造成大量線程的阻塞。于是大神們又想出了雙重鎖定 Singleton* getInstance() {if (instance == NULL){lock();if (instance == NULL){instance = new Singleton();}unlock();}return instance; } 這樣只夠極低的幾率下,通過越過了if (instance == NULL)的線程才會有進入鎖定臨界區的可能性,這種幾率還是比較低的,不會阻塞太多的線程,但為了防止一個線程進入臨界區創建實例,另外的線程也進去臨界區創建實例,又加上了一道防御if (instance == NULL),這樣就確保不會重復創建了。

?

常用的場景

單例模式常常與工廠模式結合使用,因為工廠只需要創建產品實例就可以了,在多線程的環境下也不會造成任何的沖突,因此只需要一個工廠實例就可以了。

?

優點

1.減少了時間和空間的開銷(new實例的開銷)。

2.提高了封裝性,使得外部不易改動實例。

?

缺點

1.懶漢式是以時間換空間的方式。

2.餓漢式是以空間換時間的方式。

?

C++實現代碼

#ifndef _SINGLETON_H_ #define _SINGLETON_H_class Singleton{ public:static Singleton* getInstance();private:Singleton();//把復制構造函數和=操作符也設為私有,防止被復制Singleton(const Singleton&);Singleton& operator=(const Singleton&);static Singleton* instance; };#endif

?

#include "Singleton.h"Singleton::Singleton(){}Singleton::Singleton(const Singleton&){}Singleton& Singleton::operator=(const Singleton&){}//在此處初始化 Singleton* Singleton::instance = new Singleton(); Singleton* Singleton::getInstance(){return instance; }

?

#include "Singleton.h" #include <stdio.h>int main(){Singleton* singleton1 = Singleton::getInstance();Singleton* singleton2 = Singleton::getInstance();if (singleton1 == singleton2)fprintf(stderr,"singleton1 = singleton2\n");return 0; } 1 g++ -o client Singleton.cpp client.cpp

運行結果

?


總結

以上是生活随笔為你收集整理的单例模式及C++实现代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。