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

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

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

歡迎討論~

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

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

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

[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之前先創(chuàng)建好了,還有那么多亂七八糟的鎖啊,private constructor什么的干嘛呢。  回復  更多評論
  
# re: 討論:單件模式的優(yōu)點何在?有無存在的必要?[未登錄] 2010-03-29 12:34 | x
只是一個構(gòu)建模式而已,如果到處都是,你可以提交一個反模式  回復  更多評論
  
# re: 討論:單件模式的優(yōu)點何在?有無存在的必要? 2010-03-29 12:35 | 風雷云雪電
就C++來言,全局變量和單例是差不都,不過單例相對于全局變量來說,程序員不容易出錯,程序員有可能重新實例化一個類而不是使用全局變量。
在其他語言中如Java,C#,單例是非常有必要的  回復  更多評論
  
# re: 討論:單件模式的優(yōu)點何在?有無存在的必要? 2010-03-29 13:07 | 溪流
@風雷云雪電
就C++而言,如果是不得不用的全局數(shù)據(jù),那么它應(yīng)該早早的就被規(guī)定好了的,而且只要做到不跨文件使用,出錯的幾率并不大。如果只能有一個實例,那么這個class可以靜態(tài)化。如果不許實例化,可以private掉ctor。

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

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

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

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

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

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

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


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

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

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

//...

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>>任何庫不應(yīng)該悄悄啟動線程,除了GUI

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

你會為VC6用戶生成相應(yīng)的binary嗎?

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

你要規(guī)定用戶所使用的編譯參數(shù)? 你能規(guī)定用戶使用的編譯參數(shù)?
你能確保用戶"僅僅使用你一個人的庫"?

你想得太簡單了。

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

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


而且我第3次強調(diào)了, 我不想討論全局初始化失敗應(yīng)該怎樣。
你覺得應(yīng)該怎樣你可以繼續(xù)說。

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

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

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

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

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

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

  回復  更多評論
  
# re: 討論:單件模式的優(yōu)點何在?有無存在的必要? 2010-04-03 19:51 | OwnWaterloo
@cexer
在我看來恰恰相反, 全局數(shù)據(jù)與用戶之間的交互形式有若干, 而單件只是其中一種。
  回復  更多評論
  
# re: 討論:單件模式的優(yōu)點何在?有無存在的必要? 2010-04-04 09:53 | hello
全局變量可以實現(xiàn)單件模式的功能,但是單件模式可以避免生成多個該類型的對象
  回復  更多評論
  
# re: 討論:單件模式的優(yōu)點何在?有無存在的必要? 2010-04-10 13:21 | 螞蟻終結(jié)者
還是要看實際情況,并不是任何時候都可以用全局變量替代單例的。
如在Symbian C++ S60V3以前,是不允許WSD數(shù)據(jù)(全局變量)存在的,這種情況下必須用Tls Singleton這樣的模式。。。  回復  更多評論
  
# re: 討論:單件模式的優(yōu)點何在?有無存在的必要? 2010-04-10 15:08 | tangxinfa
單件模式較之全局變量(對象)的一些優(yōu)點:
1,防止用戶構(gòu)造出另一個對象,這也就是為什么稱之為單件。
將構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)私有化,而只能通過getInstance()接口獲得唯一的實例。
2,延遲創(chuàng)建對象。
只有用到的時候才會創(chuàng)建對象,防止程序啟動時間過長,不做無用功。
3,全局變量就夠用了,但感覺以后會需要之前兩點特性。
4,全局變量命名上抓狂了:g_xxxxxxxx,globalXXXXXXXX,想來想去還不如:CXXXXXXXXXX::getInstance()夠直白。
5,調(diào)試時好設(shè)斷點。  回復  更多評論
  
# re: 討論:單件模式的優(yōu)點何在?有無存在的必要? 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>
            欧美人妖另类| 国产精品久久久久77777| 欧美xxx成人| 亚洲性图久久| 亚洲日本欧美| 亚洲黄色高清| 一本久久综合| 一区二区国产日产| 欧美精品久久久久久| 欧美精品久久久久久久| 亚洲精品日韩一| 亚洲精品久久久久久久久久久久久 | 一本久道久久综合中文字幕| 欧美成人影音| 在线视频精品一区| 亚洲欧美日本精品| 久久久国产精品一区二区三区| 欧美一区二区三区日韩视频| 久久精品国产91精品亚洲| 欧美精品免费在线| 亚洲一区网站| 欧美激情一区二区三区在线视频观看| 亚洲精选久久| 免费成人在线视频网站| 国产精品久久久久99| 欧美在线一二三四区| 欧美成人一区二免费视频软件| 久久亚洲私人国产精品va| 欧美亚洲免费在线| 亚洲国语精品自产拍在线观看| 亚洲黄色性网站| 香港成人在线视频| 国产日韩欧美黄色| 一本色道88久久加勒比精品 | 久久国内精品视频| 久久久久一区| 国产精品99久久久久久久女警 | 欧美+亚洲+精品+三区| 国内精品免费在线观看| 国产精品99久久久久久白浆小说| 欧美国产日韩精品| 亚洲成色999久久网站| 久久久高清一区二区三区| 欧美一区二区三区啪啪| 亚洲一区国产精品| 国产精品ⅴa在线观看h| 亚洲欧美中文日韩在线| 在线中文字幕一区| 欧美在线视频播放| 国产主播在线一区| 久久久国产精品一区二区中文 | 亚洲天堂久久| 久久国产精品一区二区三区| 国产精品女主播| 亚洲福利小视频| 9色国产精品| 在线成人激情黄色| 一区二区三区四区国产| 久久国产色av| 亚洲成人在线免费| 欧美日韩一卡二卡| 免费观看成人鲁鲁鲁鲁鲁视频| 久热精品视频在线观看| 久久久国产午夜精品| 最新热久久免费视频| 午夜视频一区在线观看| 久久久久久久999精品视频| 在线综合亚洲欧美在线视频| 欧美成人自拍视频| 亚洲丁香婷深爱综合| 99精品视频免费| 亚洲一区二区三区在线观看视频| 国产精品午夜电影| 亚洲国产精品一区二区久| 欧美理论大片| 裸体丰满少妇做受久久99精品| 宅男精品导航| 亚洲激情精品| 另类av一区二区| 国产一区二区日韩| 999亚洲国产精| 亚洲精品美女在线| 国产综合在线视频| 国产精品毛片在线看| 欧美日韩高清在线| 亚洲免费影院| 久久精品在线播放| 久久免费精品日本久久中文字幕| 亚洲伊人一本大道中文字幕| 久久激情网站| 美女被久久久| 欧美日韩精品中文字幕| 亚洲黄色视屏| 亚洲精品亚洲人成人网| 亚洲品质自拍| 欧美无乱码久久久免费午夜一区| 欧美日本精品在线| 国产精品毛片大码女人| 国产亚洲精品久久久久动| 狠狠色狠狠色综合日日五| 欧美精品videossex性护士| 欧美日韩成人免费| 国产日韩欧美日韩| 亚洲精品美女在线观看播放| 午夜日韩福利| 亚洲激情校园春色| 久久九九热re6这里有精品| 欧美精品一区二区三区蜜桃| 欧美亚洲成人免费| 欧美亚洲视频在线看网址| 一区二区三区无毛| 国产精品系列在线播放| 在线精品视频免费观看| 欧美一区二区三区四区在线观看| 在线日韩av| 久久久国产一区二区三区| 一区二区欧美视频| 欧美国产欧美亚州国产日韩mv天天看完整| 午夜精品福利一区二区三区av| 欧美激情第9页| 最近中文字幕日韩精品| 欧美.日韩.国产.一区.二区| 久久九九精品99国产精品| 国产欧美短视频| 红杏aⅴ成人免费视频| 亚洲国产精品www| 女人天堂亚洲aⅴ在线观看| 西西裸体人体做爰大胆久久久| 国产精品拍天天在线| 久久久久久亚洲精品杨幂换脸| 午夜精品久久| 亚洲国产成人精品久久| 欧美成在线观看| 欧美日韩伦理在线| 性欧美8khd高清极品| 欧美韩日高清| 国产一区二区三区黄| 在线不卡中文字幕| 久久久久一本一区二区青青蜜月| 亚洲精品免费在线观看| 99热精品在线观看| 亚洲素人在线| 日韩亚洲欧美中文三级| 国产精品影院在线观看| 亚洲第一主播视频| 日韩视频亚洲视频| 一区二区三区在线免费播放| 亚洲大片一区二区三区| 亚洲精品一线二线三线无人区| 欧美日韩国产综合在线| 亚洲欧美日韩中文播放| 欧美91视频| 国产精品自在在线| 亚洲免费电影在线观看| 在线日韩精品视频| 欧美一区二区三区四区在线观看 | 国产精品女同互慰在线看| 亚洲成色精品| 久久性天堂网| 久久免费的精品国产v∧| 国产精品美女久久久免费| 亚洲欧洲视频在线| 亚洲清纯自拍| 欧美色偷偷大香| 欧美在线二区| 国产婷婷成人久久av免费高清| 夜夜爽av福利精品导航 | 欧美大片va欧美在线播放| 国产日韩成人精品| 久久久天天操| 欧美jizz19性欧美| 午夜精品久久久久久久久久久| 亚洲伊人久久综合| 国产自产v一区二区三区c| 亚洲欧美日韩视频一区| 久久另类ts人妖一区二区| 亚洲成人影音| 国产精品成人一区二区艾草| 亚洲自拍偷拍色片视频| 久久久精彩视频| 亚洲作爱视频| 国内精品免费在线观看| 欧美国产视频在线观看| 午夜精品久久久久久久久久久久久| 久久精品国产欧美激情| 一区二区亚洲精品国产| 欧美日韩国产在线一区| 久久精品中文字幕免费mv| 日韩西西人体444www| 亚洲国产日韩欧美在线99| 欧美亚韩一区| 欧美大尺度在线观看| 久久在线91| 毛片精品免费在线观看| 性色av一区二区三区在线观看| 亚洲午夜精品久久| 亚洲免费观看高清完整版在线观看熊| 欧美成人高清视频| 欧美激情91| 99国产精品|