青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-90  評論-947  文章-0  trackbacks-0

我的觀點可能有點激進,我覺得單件模式啥也不是,純粹是個全局變量的貞潔牌坊而已。全局變量如果有必要,用就用了,何必偽裝;如無必要,就算穿上單件模式的馬甲,到頭來也會搞得一片狼籍——隨處可見GetInstance。

歡迎討論~

posted on 2010-03-29 10:58 溪流 閱讀(4498) 評論(63)  編輯 收藏 引用 所屬分類: C++

評論:
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 11:43 | 空明流轉
單間的實例限定和訪問可控,你能global做到撒?盡白扯。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 11:48 | 溪流
@空明流轉
沒白扯。
如果要限定單一實例,這個類實際上需要是個靜態類。

訪問可控?我就不懂了,,單件模式訪問哪里可控?  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 12:21 | 陳梓瀚(vczh)
@空明流轉
最容易的辦法就是

[ShitOperator.h]

class IShitOperator
{
public:
virtual void DoShit()=0;
};

extern IShitOperator* GetShitOperator();

//--------------------------------------------------------
[ShitOperator.cpp]

class ShitOperator : public IShitOperator
{
..
} shitOperator;

IShitOperator* GetShitOperator()
{
return &shitOperator;
}

-------------------------------------------------------------

我TM就不知道一個單件哪來那么多問題,拿一個純虛類一套,不管三七二十一你用沒用到反正我在main之前先創建好了,還有那么多亂七八糟的鎖啊,private constructor什么的干嘛呢。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要?[未登錄] 2010-03-29 12:34 | x
只是一個構建模式而已,如果到處都是,你可以提交一個反模式  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 12:35 | 風雷云雪電
就C++來言,全局變量和單例是差不都,不過單例相對于全局變量來說,程序員不容易出錯,程序員有可能重新實例化一個類而不是使用全局變量。
在其他語言中如Java,C#,單例是非常有必要的  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 13:07 | 溪流
@風雷云雪電
就C++而言,如果是不得不用的全局數據,那么它應該早早的就被規定好了的,而且只要做到不跨文件使用,出錯的幾率并不大。如果只能有一個實例,那么這個class可以靜態化。如果不許實例化,可以private掉ctor。

對于java,C#,單例又體現在哪里?C#已經支持了 static class 的寫法了  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 13:12 | 溪流
@x
因為我看到挺多地方都說單例模式如何如何了得,但是想不通,所以有此感慨。
  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 13:13 | 溪流
@陳梓瀚(vczh)
例子看懂了。但我看不太明白你的觀點,呵呵  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 13:37 | Kevin Lynx
@溪流
這個問題某種角度來看,就如同對成員變量不管應用情景如何都提供Get/Set一樣,同public一樣了。

我覺得唯一的區別,還是一種安全控制吧:
class Singleton
{
public:
static Singleton &GetInstance() { static Singleton ob; .... }
private:
Singleton() { ... }
Singleton( const Singleton & ) ...
};
那么,這個Singleton對象就只存在一份。

當然,也有單件不作constructor的private限制的。
  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 13:55 | qiaojie
單件模式確實是一個錯誤。但是不應該用全局變量代替單件,而是應該用一組全局函數帶代替單件模式,就像系統API那樣。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 13:59 | 溪流
@qiaojie
一組全局函數如果一定要完全OOP則可以封裝到“靜態類”里面:
class AAA
{
public:
static void foo();
static void bar();
//...

private:
AAA();
};  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 14:10 | 溪流
@Kevin Lynx
我覺得你這個例子并不說明什么
這個例子就是通常的單件模式的使用情形。

1、它沒有避免全局變量的弊端。對結構不太注意的人隨時可以Singleton::GetInstance();

2、如果它要單一實例,那么這里肯定有一個內在因素。一個比較通常的情況是,這個類是一個框架(或某個框架的一部分)。既然它是框架,那么框架本身自然可以將其隱藏,或者以本框架最頭條使用說明的方式明令禁止實例化。如MFC的CWinApp,如果有人實例化2個CWinApp導致錯誤,一定是那個人太小白了而不是MFC太傻;類似的可能還有NTService的封裝。除此之外可能還有些啥原因我一時羅列不出來。

3、如果它要被多個局部共享,那么這實際上就是赤果果的全局變量,用了就用了,沒必要假裝沒用過


至于get和set,我現在還不知道自己感覺到底如何。至少我認為不是所有的都需要public出來的。最多,給所有非隱藏變量個get,給所有非只讀公開變量來個set就差不多了吧。

  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 14:26 | yrj
@溪流
一組全局函數如果一定要完全OOP則可以封裝到“靜態類”里面:

靜態類沒必要
namespace AAA
{
void foo();
void bar();

//...

} // namespace AAA  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 14:32 | 溪流
@yrj

我是說,如果要滿足形式上的OOP  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 14:58 | 遠古毛利人
我覺得單件模式給庫作者使用比較好,因為靜態數據沒法避免用戶多次定義。
單件的話因為長得顯眼,用戶一看就知道。
另外,在GetInstance()里也可以做一些復雜的初始化動作,呵呵。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 15:03 | gbb21
鑒于溪流GG的blog上了我的google reader,于是特來YM  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要?[未登錄] 2010-03-29 15:16 | chentan
用C的思維去思考,就沒有那么多思想負擔了  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 15:45 | 矩陣操作
@遠古毛利人
同意你這個看法。C++里面單件形式意義大于實際意義。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 15:47 | 空明流轉
@溪流
設計模式的目標在兩個方面:
一個方面是給你一點你需要的自由,第二個是不給你除了給你的自由以外的東西。

某種意義上,Singleton是最好的用例。至于Singleton的實現,有很多種。
VCZH提供的,也是一種實現。

我看了一下樓上的評論,似乎都狹隘的將Singleton局限在Class::Instance()這樣的GOF標準里面了。
但是實際上不盡然。特別是橫跨Binary的,或者是C-Compatible的設計,都一定是GetXXX()這樣一個自由函數的實現。

所以討論Singleton模式,并不只是討論實現,更重要的,是討論兩點,也就是我最初提到的兩點:

第一,一個類型實例數量的限制;
第二,訪問感知性(比方說如果我是GetInstance的時候,我每次訪問都可以明明白白的追蹤到訪問點。而Global就比較困難,有時候你很難知道變量在什么時候被修改了。)  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 16:33 | 溪流
@空明流轉
前面的論述我基本上接受,但最后兩點還是想不通

比如第二點,我要知道他什么時候被修改了,如果用的是全局變量,我可能要全工程搜索變量名字,如果是單件模式,我可能要全工程搜索XXX::GeInstance(),這一點我看不出單件模式帶來的任何好處  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 16:34 | OwnWaterloo
@空明流轉
>>都一定是GetXXX()這樣一個自由函數的實現

這沒錯。 而且還要區分2種語意:
1.
xxx_init
...
xxx_get

2.
xxx_get_and_init
第2種語意我不喜歡。


將xxx_get, xxx_init搞成xxx::instance完全是脫了褲子放屁。
本身就是一個free function的事情, 非要搞出個class出來。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要?[未登錄] 2010-03-29 16:51 | 清風
@溪流
遇到這種情況,難道你不是在GetInstance函數里檢測被修改的時機嗎.....?  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 17:23 | 唐榮軍
你已經進步了,等哪次你覺得它還是有必要的時候,就表明你更進一步了。祝好運!  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 17:26 | 空明流轉
@溪流
斷點,謝謝。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 19:53 | 陳梓瀚(vczh)
@OwnWaterloo
1:堅持所有singleton都必須在main之前自動初始化完成
2:堅持singleton之間不能有任何使用關系
3:因此不需要XX_init,get就好了  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 20:05 | OwnWaterloo
@陳梓瀚(vczh)
main之前自動初始化也是需要代碼的。

C++的運行庫會幫忙做這個事情。而C不行。 至少標準C不行。
編譯器提供的DllMain或者 __atrribute__(constructor)啥啥的不算。

所以, C里面init是需要的。
  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-29 22:10 | 空明流轉
@陳梓瀚(vczh)
這種堅持通常都頗具難度。。。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要?[未登錄] 2010-03-30 09:28 | hh
不去老老實實坐點業務 討論這個有1毛的意義嗎?

  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 09:53 | Iloveprogram
@陳梓瀚(vczh)
剛學singleton的時候,也是為那些個多線程不安全的問題煩惱過。后來一想何必那么麻煩,在使用以前實例化好就得了,使用的時候直接get。這樣性能又好,又簡潔。
看到大師也有這種觀點,很是欣慰,呵呵。

btw,對你現在在做的東西很感興趣,不過我自己水平未到。

  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 09:59 | 溪流
@hh
你如果覺得沒意義,大可不必來此浪費時間,謝謝!  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 10:01 | 溪流
@唐榮軍
我喜歡你的這種口氣,但希望知道你的具體內容,不然這樣的話我也會說  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 10:01 | 溪流
@空明流轉
好的!這算單件模式一個優點吧。。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 10:25 | holyfire
單件可以在設計時就考慮到自己是唯一的實例,但是用全局對象有幾個問題,

1:對象可能產生多個實例,如果你的類隱藏的數據成員可能被構造函數修改的話,提供者就會失去控制權。比如一個不小心使用了值參數導致臨時對象被構造。

2:如果有代碼在main前面執行的話有初始化順序問題

3:如果這個單件是個基類指針,單件可以在運行時配置并保證多線程安全

4:如果這個單件在DLL中并會被重新加載,單件模式更方便使用

5:單件模式和全局變量相比較只是書寫習慣的問題

那么,如果你的要求很簡單并沒有涉及到以上問題(可能還有一些問題我沒發現),那么全局變量的確可以滿足你的要求。

很多人都覺得main之前初始化單件很容易,那是你工作的內容面還不夠廣,很多方面會導致你的代碼在main前面執行而且是你不知道的情況下,比如DLL的靜態鏈接庫方式使用,使用第3方庫,比如ACE會修改main宏替換自己的main函數,或者你的代碼本身就在DLL中。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 11:20 | 空明流轉
@holyfire
Ace在工程上,就是一坨屎。。。完全沒法用。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:52 | 陳梓瀚(vczh)
@OwnWaterloo
不管要不要代碼初始化,只要你堅持所有不同的singleton對象都不需要依賴于其他singleton對象來創建那么就沒有問題。如果不行,那么證明設計有錯,或者沒錯但是很難實現,或者沒錯很容易實現但是很容易寫出bug,總之要改。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:53 | 陳梓瀚(vczh)
@hh
你要是能把你做的業務寫到博客,看公司開不開你啦  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:53 | 陳梓瀚(vczh)
@空明流轉
控制大工程需要使用一些可能會造成開發起來有一點點麻煩,但是從根本上排除了很多bug的根源的方法。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:55 | 陳梓瀚(vczh)
@OwnWaterloo
用一種語言去表達一些概念,如果造成不可消除的重復代碼或模式的話,那么應該在可能的情況下更換語言。舉個例子,你為PC開發軟件,那么C完全沒必要,C++能兼容它。因此你可以引入一點點C++的特征去消除你的困難,剩下的你愛用C寫就用C寫。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:55 | 陳梓瀚(vczh)
@Iloveprogram
要以發展的眼光看問題。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:56 | 陳梓瀚(vczh)
@OwnWaterloo
話說回來,只要保持singleton必須在main前構造完畢這個原則的話,就算你singleton的創建互相依賴,也是不需要鎖的。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 15:58 | 陳梓瀚(vczh)
@holyfire
那證明你把不該singleton的東西給singleton了,應該修改設計,而不是想辦法實現singleton。

舉個簡單的例子,我可能需要在很多地方使用相同的正則表達式,那么每次都寫regex(L"....") r;顯然是浪費了構造時間的,所以這可能就會被放在一個全局的地方。那你說應不應該做成singleton呢?顯然是不需要的,你需要的是把你這些regex放在一個Context類里面,在main函數創建,然后傳遞給所有其他對象。

還有,一個類是否應該成為singleton,不是類自己決定的,而是使用類的那個人決定的。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 16:05 | OwnWaterloo
@陳梓瀚(vczh)
>>用一種語言去表達一些概念,如果造成不可消除的重復代碼或模式的話,那么應該在可能的情況下更換語言。

只所以要說C:
1. 上面提到了C
2. C++做二進制兼容的東西很煩

而且, 如果不了解C++在初始化靜態對象時做了哪些工作, 就會犯錯。
比如, 很多人都覺得C++靜態對象初始化是線程安全的, 其實是和實現相關的。
  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 16:12 | OwnWaterloo
@陳梓瀚(vczh)
>>不管要不要代碼初始化,只要你堅持所有不同的singleton對象都不需要依賴于其他singleton對象來創建那么就沒有問題。如果不行,那么證明設計有錯,或者沒錯但是很難實現,或者沒錯很容易實現但是很容易寫出bug,總之要改。

你說得也太武斷了。 設計有問題?
總有東西的初始化需要申請內存, 能不依賴C heap和C++ free store?

初始化后有部分東西又需要向atexit注冊, 又依賴另一個全局的東西。
初始化失敗, 有部分人喜歡寫log(雖然我不喜歡), 再次依賴全局的東西。
  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 16:14 | OwnWaterloo
@陳梓瀚(vczh)
>>話說回來,只要保持singleton必須在main前構造完畢這個原則的話,就算你singleton的創建互相依賴,也是不需要鎖的。

class evil
{
evil()
{
pthread_create(... );
_beginthreadex( ... );
}
};

如果這個例子確實太邪惡, 別忘了還有可能會碰見進程共享數據。
  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 17:57 | holyfire
@陳梓瀚(vczh)
雖然看不明白你想對我表達什么,或者是找錯人了?不過感覺你有點想當然了,好像人人都該像你規定的那樣去做,不過我遇到的問題大多是是工作上實際遇到事,而你說的那個例子更像是用原型模式(Prototype)的情況,當然不應該作為單件模式,而且我并沒有舉例子說什么什么情況下該用單件模式,而是說遇到某種情況用單件模式比全局對象好,麻煩你看仔細點。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 18:50 | 溪流
到后面我都看不大懂了~~~
搬張凳子學習了,各位大俠請繼續~  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 22:25 | 陳梓瀚(vczh)
@OwnWaterloo
1:初始化的時候連內存都申請不了應該直接崩潰,這是最好的辦法。所以這個不是理由。

2:main函數執行之前沒有其他線程,不存在共享的讀取問題。如果需要啟動線程,應該讓singleton提供函數讓main函數執行并啟動。任何庫不應該悄悄啟動線程,除了GUI。再者,你應該充分信任平臺API,這是唯一你不可控制的東西。

3:singleton初始化的時候不相互依賴是一件好事,如果實在非依賴不可,那么一方面說明你可能將不應該singleton得給singleton了,另一方面則有可能是你把本來應該存在同一個singleton得給拆分成多個singleton了,種種設計問題帶來的非依賴不可的結果。

4:如果一個二進制發行的庫是你開發的話,那么不再庫里面提供singleton是一個很好的選擇。一個程序的所有singleton只能存在在exe里面。話說回來,二進制其實不是問題,你應該堅持你自己的程序和庫都是用同一個編譯器編譯。如果庫沒提供二進制,那么應該索取代碼,是在索取不了,那么使用其他庫。作為一個庫的發行者,要么提供C++代碼,要么提供所有流行編譯器的二進制編譯結果。這才是負責任的,除非你從一開始就不打算跨編譯器或者跨平臺(windows和linux都有主流C++編譯器)。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 22:31 | 陳梓瀚(vczh)
@OwnWaterloo
然后我再次強調,一個類是否應該當成singleton,應該取決于調用者而不是類自己,除非因為平臺的API限制(譬如說windows下面的GUI通常都會有的Application類)  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-30 22:37 | OwnWaterloo
@陳梓瀚(vczh)
>>初始化的時候連內存都申請不了應該直接崩潰,這是最好的辦法。所以這個不是理由。

"申請不了"同"需要依賴內存分配器已初始化" 完全是兩碼事。
你又跑題了。

>>任何庫不應該悄悄啟動線程,除了GUI

這只是"你覺得"應該這樣。
但你馬上又說了一個反例。

3. 我只想說對全局某些服務的依賴是很難避免的。
singleton關我什么事? 我老早不用這種脫了褲子放屁的玩意了。


>>作為一個庫的發行者,要么提供C++代碼,要么提供所有流行編譯器的二進制編譯結果。這才是負責任的。

作為一個二進制庫的發布者, 將庫用C實現并提供C++的header-only的綁定層; 或者發布C++的源代碼。
這才是負責任的。

所有流行編譯器? 你知道什么叫所有流行編譯器么?
編譯器種類×編譯器版本×編譯器運行庫版本×你的庫版本

你覺得你能負這個責, 你就繼續玩吧。
  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要?[未登錄] 2010-03-31 10:42 | sun
我想還是比較有用的,舉個例子,也是我做過的,創建一個singleton類,需要常鏈接到服務器,時序同步,在不同的線程間共享,非常的高效,尤其是在資源很缺乏的機器上,像iphone設備,碰到了就覺得需要了.......
其實平時很少用!  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-31 15:40 | 陳梓瀚(vczh)
@OwnWaterloo
顯然“所有流行編譯器版本”是一個你只需要下載完寫了從vcproj到的makefile生成器以后就自動完成的事情,一勞永逸也,想做當然能做,而且隨時更新。運行庫版本一律使用static鏈接,因此可以跟你的編譯器版本捆綁在一起。而且,編譯器的【小版本】之間的變化導致lib不能通行應該歸咎于編譯器的質量,而不是你。

第二,反例當然是要的,有些東西必須成為singleton,典型的GUI就是,一個程序不可能也不應該同時使用N套平行的GUI庫(嵌套關系除外)。所以這個沒有任何問題。

第三,main之前的任何異常都不要捕捉,任由崩潰。想log就捕捉了log,log完還是要throw;以便崩潰

第四,二進制發布者那一句我們兩個說法沒有任何區別

第五,VC++里面沒有看見任何singleton在創建前new還不能用的,如果其他編譯器有,那是編譯器的bug,要么放棄它,要么放棄singleton。

第六,我的所有觀點都從以下方面出發
1:盡可能將bug扼殺在搖籃里
2:制作出來的程序容易被更改  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-03-31 15:57 | OwnWaterloo
@陳梓瀚(vczh)
>>顯然“所有流行編譯器版本”是一個你只需要下載完寫了從vcproj到的makefile生成器以后就自動完成的事情,一勞永逸也,想做當然能做,而且隨時更新。

這只是構建腳本而已。 我說的是不同編譯器產生出的二進制代碼的兼容性。
你能用msvc鏈接到一個mingw生成的二進制庫嗎?
你能用msvc鏈接到前一個crt版本嗎?

>>運行庫版本一律使用static鏈接,因此可以跟你的編譯器版本捆綁在一起。
看吧, 你又"一律", "一定" 什么的了。

這是C++語言本身的問題。 C++的特性太復雜, 而且是一門開放的語言, 所以會有很多二進制上不兼容的特性。
而且C++這門語言本身就會促使開發者使用復雜的設計。

>> 一個程序不可能也不應該同時使用N套平行的GUI庫(嵌套關系除外)
你沒見過而已。 確實有這樣的東西存在。 MFC+WTL+還有一個什么忘記了。
當然, 那東西確實丑陋。
不過已經是這樣子了, 推倒重來的代價公司受不起, 用戶也受不起。


>>main之前的任何異常都不要捕捉,任由崩潰。想log就捕捉了log,log完還是要throw;以便崩潰
再次強調, "需要全局的依賴" 和 "處理全局初始化錯誤" 是兩回事。
  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-01 01:46 | 沙城來客
1.做個標識,讓人家知道這個東西是單例的 明白該怎么用 全局就沒有這種作用,不過到底怎么用是調用者的問題,不過至少自己的份內事情要做好
2.推遲初始化 在大系統里面一開始一堆全局的大類進行初始化是很恐怖的事情  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-01 15:50 | 陳梓瀚(vczh)
@OwnWaterloo
如果你搞定了構建腳本,你怎么還會有vc連接不了mingw的lib的問題呢?已經被生成的一大堆lib搞定了,你挑一個正確的就好了。

“C++促使程序猿使用復雜的設計”這個東西跟論點沒有任何關系,既然要寫庫,那么肯定會有些約束的。一律和一定跟這個沒有任何沖突。根據第一個觀點,第一,構建腳本好寫。第二,有了足夠的構建腳本你就可以挑選任意種類的lib。第三,因此編譯器相同,因此可以static。因為這是運行庫,運行庫跟程序里面的功能模塊是兩回事,尺寸特別小,static沒有任何壞處,沒有static你還有機會犯錯。

我們并不需要照顧100%的人的需求,譬如少數公司因為歷史原因造成的N個GUI一起使用等等(其實歷史原因跟singleton的主題并沒有什么大的關系)

最后,我不認為全局初始化錯誤除了log以外應該做其他事情。如果連初始化都沒搞定,那么顯然應該崩潰。如果不應該崩潰,那么那個東西就不屬于初始化的一部分,而應該類似于“插件”,這種時候不能用singleton,而應該用一個manager來管理這些事情。當然manager需不需要singleton是另外一回事請,總之是在main之后才開始做的。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-01 16:57 | OwnWaterloo
@陳梓瀚(vczh)
>> 一大堆lib搞定了,你挑一個正確的就好了。
挑得出來嗎?

你會為VC6用戶生成相應的binary嗎?

客戶使用了-fabi-version 怎么辦?
客戶使用了-mno-align-double又怎么辦?

你要規定用戶所使用的編譯參數? 你能規定用戶使用的編譯參數?
你能確保用戶"僅僅使用你一個人的庫"?

你想得太簡單了。

>> 那么肯定會有些約束的
這些約束會被很不經意的打破。 很難控制住。
因為C++給了程序員太多可以玩, 可以炫的東西。
所謂的"心智包袱"。

>>尺寸特別小,static沒有任何壞處
算了, 你總是把很有爭議的話說得如此絕對, 我還能說你什么呢。


而且我第3次強調了, 我不想討論全局初始化失敗應該怎樣。
你覺得應該怎樣你可以繼續說。

我上面舉的例子, 僅僅是為了說明對"全局的依賴很難避免"。
我覺得已經足夠說明了。
  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-02 12:25 | cexer
把單件放在其它模式堆里,確實有點雞立鶴群的感覺,它并沒有其它模式那樣有啟發性,所有寫程序的人都知道世上有全局變量這個東西,那何必要取個好聽的名字像模像樣地研究一番呢,《設計模式》的偉大除了讓人學會到很多手法,還有一點就是統一了很多概念,并為之提供了許多標準的名詞方便大家研究,綜上所述,我覺得“單件”就是一個虛名,你喜歡叫它“全局變量”也行,大家心里的概念沒有差別,只是未必真是用全局變量來實現而已,所以不用在一個名字上糾結。

誰不想用赤祼祼的全局指針,它們原始又純樸,天然無雕飾。可是真的要用它們來實現一份庫級別的代碼,就好像雙手拋飛刀一樣危險,不僅拋的人要兩眼圓睜神經緊繃,連觀眾都要跟著捏一把冷汗。全局變量本來沒有錯,錯的是在它們之上作出的許多美好的假設,假設誰一定在誰之前產生,誰一定在誰之后銷毀,誰依賴著誰,誰又被誰依賴著,誰是線程安全的,誰又一定不會被多線程訪問。互相完全沒有依賴關系,不用額外控制,像終結者一樣智能,完成任務又知道自己終結的全局變量,只是個傳說。

有很多以單件名字的手法,Meyers 單件,Alexandrescu 單件,Phoenix 單件,Schwarz 計數器,你看它們好多都叫做“單件”,但是你喜歡叫 Meyers 全局對象,Alexandrescu 全局對象,Phoenix 全局對象 也可以。

我個人覺得,把“全局變量”拿來和“單件”相提并論是很不妥的事件。就好像拿“汽車”和“交通工具”比一樣。不是一個層面上的東西,單件也許是全局變量,也可以不是,“全局”也有多種理解角度,存儲位置(堆上,棧上,靜態數據區),生存區域(線程局部,進程局部,模塊內部),生存周期(何時生,何時死,不死)。只是“全局變量”已經不能說明它的復雜度,但是一提“單件”大家都明白將要說的是什么,這就是“單件”存在的價值,這也是《設計模式》一書提出“單件模式”偉大所在。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-02 15:54 | OwnWaterloo
@cexer
用于單件的那些技術, 同樣可以用于全局數據初始化。

C運行庫為你初始化堆分配器, 不也不需要你多余控制?
進程終結后也會自己終結。
呃, C庫不一定會真正釋放, 有可能留給OS。
那換個例子, atexit。

所以單件根本不是什么偉大的發明。
只是OO時代的順應產物。
  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-03 01:22 | cexer
@OwnWaterloo
我說的可能不大清楚,我的意思是“單件模式”只是一種概念,正是類似“全局數據”這種東西的一種抽象形容,不然何以稱“模式”。拿“單件模式”和“全局數據”本身比,是沒有可比性的,一為抽象,一個具體,一為模式,一為實例。它跟OO也沒有關系,一個C全局裸指針,也是一份單件的實體。所以不要再比來比去的了。

  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-03 19:51 | OwnWaterloo
@cexer
在我看來恰恰相反, 全局數據與用戶之間的交互形式有若干, 而單件只是其中一種。
  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-04 09:53 | hello
全局變量可以實現單件模式的功能,但是單件模式可以避免生成多個該類型的對象
  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-10 13:21 | 螞蟻終結者
還是要看實際情況,并不是任何時候都可以用全局變量替代單例的。
如在Symbian C++ S60V3以前,是不允許WSD數據(全局變量)存在的,這種情況下必須用Tls Singleton這樣的模式。。。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2010-04-10 15:08 | tangxinfa
單件模式較之全局變量(對象)的一些優點:
1,防止用戶構造出另一個對象,這也就是為什么稱之為單件。
將構造函數、拷貝構造函數私有化,而只能通過getInstance()接口獲得唯一的實例。
2,延遲創建對象。
只有用到的時候才會創建對象,防止程序啟動時間過長,不做無用功。
3,全局變量就夠用了,但感覺以后會需要之前兩點特性。
4,全局變量命名上抓狂了:g_xxxxxxxx,globalXXXXXXXX,想來想去還不如:CXXXXXXXXXX::getInstance()夠直白。
5,調試時好設斷點。  回復  更多評論
  
# re: 討論:單件模式的優點何在?有無存在的必要? 2015-05-22 16:35 | lurenjia
@陳梓瀚(vczh)
輪子哥。。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产激情| 亚洲精选在线| 欧美一区激情| 午夜精品视频在线| 韩国一区电影| 亚洲国产精品久久人人爱蜜臀 | 亚洲素人一区二区| 国产精品美女一区二区| 香蕉视频成人在线观看| 亚洲免费视频在线观看| 午夜精品久久久久久久久久久久久 | 老司机精品视频网站| 久久爱www久久做| 亚洲激情在线| 一区二区日韩| 在线不卡亚洲| 亚洲免费观看在线观看| 国产婷婷精品| 亚洲欧洲一区二区三区久久| 国产精品久久久久久影视| 久久精品视频在线观看| 欧美成人自拍视频| 亚洲免费一区二区| 麻豆精品一区二区综合av | 精品成人久久| 一本色道久久综合狠狠躁篇怎么玩| 国产精品自拍小视频| 亚洲国产精品高清久久久| 国产精品色婷婷| 欧美成人一区二区三区片免费| 欧美天堂在线观看| 免费精品视频| 国产热re99久久6国产精品| 亚洲国产岛国毛片在线| 国产精品一区二区久久精品| 亚洲激情一区二区| 激情综合电影网| 日韩视频一区二区三区| 亚洲高清资源综合久久精品| 亚洲影院免费| 亚洲视频免费观看| 免费看亚洲片| 久热综合在线亚洲精品| 国产精品专区一| 一区二区三区视频在线看| 亚洲激情自拍| 另类亚洲自拍| 欧美成人一品| 亚洲电影免费观看高清完整版 | 久久裸体艺术| 欧美电影免费观看高清| 欧美日韩在线一区二区三区| 欧美wwwwww| 伊人久久噜噜噜躁狠狠躁| 亚洲欧美中文在线视频| 亚洲女人小视频在线观看| 欧美日韩免费网站| 亚洲精品中文字幕在线| 日韩午夜激情| 欧美激情中文字幕一区二区| 欧美激情一区二区三区蜜桃视频| 亚洲春色另类小说| 久久综合九九| 欧美肥婆在线| 最新国产成人av网站网址麻豆 | 欧美亚洲自偷自偷| 久久狠狠婷婷| 国内外成人免费激情在线视频网站 | 国产精品99久久久久久www| 欧美精品在线免费| 日韩天堂在线视频| 亚洲在线视频| 国产一区二区三区无遮挡| 翔田千里一区二区| 久久婷婷色综合| 在线观看视频一区| 欧美成人免费在线| 亚洲乱码一区二区| 亚洲欧美日韩国产综合| 国产欧美一级| 久久影视精品| 亚洲七七久久综合桃花剧情介绍| 一区二区三区久久| 国产精品色婷婷久久58| 久久久久9999亚洲精品| 亚洲二区视频| 亚洲一区日韩在线| 狠狠色丁香婷婷综合久久片| 免费不卡在线视频| 亚洲视屏在线播放| 美女国产一区| 一本色道88久久加勒比精品| 国产精品久久久亚洲一区| 免费亚洲视频| 久久久7777| 亚洲视频axxx| 欧美高清视频免费观看| 欧美一区二区三区在线免费观看| 国产一区二区欧美| 欧美成人一区二区三区| 99视频精品在线| 久久在线视频在线| 亚洲免费中文| 亚洲国产成人porn| 国产精品日韩欧美综合| 免费观看亚洲视频大全| 亚洲永久精品国产| 亚洲日本无吗高清不卡| 久久狠狠久久综合桃花| 99在线|亚洲一区二区| 国产麻豆综合| 欧美日韩中文字幕在线视频| 久久婷婷成人综合色| 亚洲在线视频一区| 国产一区二区三区在线观看视频 | 狠狠色狠狠色综合人人| 欧美久久久久久久久| 欧美一区二区三区在线观看| 91久久精品国产91性色tv| 香港久久久电影| 99国产精品| 91久久在线播放| 国内精品久久久久久久影视麻豆| 欧美日韩在线播| 欧美顶级艳妇交换群宴| 久久久久九九九| 欧美一区二区三区视频| 在线亚洲一区二区| 亚洲精品中文在线| 亚洲国产合集| 欧美激情视频一区二区三区在线播放| 欧美一区二区在线| 午夜精品剧场| 亚洲女ⅴideoshd黑人| 一区二区三区精密机械公司| 亚洲六月丁香色婷婷综合久久| 91久久国产综合久久91精品网站| 红桃视频欧美| 亚洲大片免费看| 亚洲国产一区视频| 亚洲人午夜精品| 亚洲精品色图| 一本久道久久久| 亚洲视频在线观看| 亚洲视频一区在线| 亚洲一区二区三区视频| 亚洲免费在线观看视频| 欧美一区2区视频在线观看| 欧美一区二区三区在| 久久福利资源站| 久久手机免费观看| 欧美激情一区二区三区在线视频| 欧美激情国产日韩精品一区18| 欧美激情精品久久久久久蜜臀| 亚洲国产精品第一区二区 | 亚洲自拍另类| 欧美一级欧美一级在线播放| 欧美一级电影久久| 久久青青草原一区二区| 欧美大香线蕉线伊人久久国产精品| 欧美91视频| 亚洲免费观看高清完整版在线观看熊 | 99精品视频免费观看| 亚洲一区二区欧美| 久久av免费一区| 欧美大片在线观看一区| 日韩午夜电影av| 性色av一区二区三区| 乱人伦精品视频在线观看| 欧美人牲a欧美精品| 国产女主播一区二区| 亚洲国产91精品在线观看| 一区二区三区视频在线播放| 欧美中文字幕视频| 欧美激情精品久久久久久大尺度| 一本色道久久加勒比精品| 欧美诱惑福利视频| 欧美电影专区| 国产啪精品视频| 99re热精品| 久久色在线观看| 99国产精品久久久久久久| 欧美在线影院在线视频| 欧美日韩二区三区| 欧美va亚洲va国产综合| 亚洲视频欧洲视频| 99成人精品| 久久免费国产| 一区二区三区欧美在线| av72成人在线| 99国产精品久久| 久久免费视频在线观看| 国产精品久久久久9999吃药| 在线观看中文字幕不卡| 午夜精品在线看| 亚洲精品国产拍免费91在线| 欧美一区二区三区四区视频| 欧美激情一区二区三区在线视频| 国内成人精品一区| 亚洲免费中文|