討論區快速選單
知識庫快速選單
網路投保旅行平安險 最紅的App開發語言:Kotlin
[ 回上頁 ] [ 討論區發言規則 ]
一個Singleton design pattern的問題!
更改我的閱讀文章字型大小
作者 : scliu(scliu) VB.Net卓越專家
[ 貼文 170 | 人氣 7157 | 評價 1790 | 評價/貼文 10.53 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/6/25 下午 08:48:31
一個標準的Singleton design pattern程式碼如下(VB.NET):
Public Class MySingleton
    Private Shared m_Instance As MySingleton
    Private Sub New()
    End Sub

    Public Shared Function GetInstance() As MySingleton
     If m_Instance is Nothing Then
     m_Instance = New MySingleton()
     End If
     Return m_Instance
    End Function
End Clasee
以上的寫法,是幾乎每一本Design Pattern的書都是如此寫的,但是小弟看到另一個寫法
是朋友寫的,如下:
Public Class MySingleton
    Private Shared m_Instance As New MySingleton
    Private Sub New()
    End Sub

    Public Shared Function GetInstance() As MySingleton
     Return m_Instance
    End Function
End Clasee
小弟看了看,也沒錯啊,但是這樣的寫法看起來更加精簡,卻找不到有什麼漏洞,所以貼上來
請各為前輩看看這樣寫到底有沒有問題啊?如果沒問題,小弟就可以放心的用!
謝謝各位!
作者 : sunny_gong(simula)討論區板主 C++頂尖高手貼文超過500則人氣指數超過30000點
[ 貼文 892 | 人氣 45047 | 評價 7220 | 評價/貼文 8.09 | 送出評價 108 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/6/29 上午 09:23:38
如果 New() 會使用到 Form 建立完成後才有的資料,譬如那個 Handle,那你的寫法比較保險一點。目前這樣寫是沒什麼差別,因為 New() 沒有參考到任何執行期的資料。我對 VB.NET 不是很熟,只是提出以前使用 VB 的經驗。
作者 : jykuo(kjy)
[ 貼文 19 | 人氣 1 | 評價 100 | 評價/貼文 5.26 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/4 下午 10:00:22
精簡的寫法問題可能為
若此class被繼承可能產生無謂的 object

因為對 ASP.NET不熟,所以不知道這樣說對不對

>一個標準的Singleton design pattern程式碼如下(VB.NET):
>Public Class MySingleton
> Private Shared m_Instance As MySingleton
> Private Sub New()
> End Sub
>
> Public Shared Function GetInstance() As MySingleton
> If m_Instance is Nothing Then
> m_Instance = New MySingleton()
> End If
> Return m_Instance
> End Function
>End Clasee
>以上的寫法,是幾乎每一本Design Pattern的書都是如此寫的,但是小弟看到另一個寫法
>是朋友寫的,如下:
>Public Class MySingleton
> Private Shared m_Instance As New MySingleton
> Private Sub New()
> End Sub
>
> Public Shared Function GetInstance() As MySingleton
> Return m_Instance
> End Function
>End Clasee
>小弟看了看,也沒錯啊,但是這樣的寫法看起來更加精簡,卻找不到有什麼漏洞,所以貼上來
>請各為前輩看看這樣寫到底有沒有問題啊?如果沒問題,小弟就可以放心的用!
>謝謝各位!
作者 : tycoonj(小毛)
[ 貼文 28 | 人氣 8708 | 評價 90 | 評價/貼文 3.21 | 送出評價 11 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/4/20 上午 12:38:28

>一個標準的Singleton design pattern程式碼如下(VB.NET):
>Public Class MySingleton
> Private Shared m_Instance As MySingleton
> Private Sub New()
> End Sub
>
> Public Shared Function GetInstance() As MySingleton
> If m_Instance is Nothing Then
> m_Instance = New MySingleton()
> End If
> Return m_Instance
> End Function
>End Clasee

根據Head First Design Pattern的說法
上面的方式會在GetInstance()這個function被叫用時才會建立MySingleton的物件
下面的方式則是MySingleton可能在在GetInstance()這個function被叫用前就建立了,因為Private Shared m_Instance As New MySingleton裡的new字的關係。至於什麼時候建立,就看 .net framework 高興了

書上還說啦,在multithread的情況下,上面的方法不保證建立唯一的物件
但下面的方法還能保證建立唯一的物件

>Public Class MySingleton
> Private Shared m_Instance As New MySingleton
> Private Sub New()
> End Sub
>
> Public Shared Function GetInstance() As MySingleton
> Return m_Instance
> End Function
>End Clasee

然後,其實我是要來問問題的
既然是要確保建立唯一的物件
那麼通通都用 static 來宣告,不也是唯一嗎?為什麼不用 static 呢?
作者 : minlin(秀逗)
[ 貼文 38 | 人氣 4209 | 評價 30 | 評價/貼文 0.79 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/4/27 上午 02:55:22

>
>>一個標準的Singleton design pattern程式碼如下(VB.NET):
>>Public Class MySingleton
>> Private Shared m_Instance As MySingleton
>> Private Sub New()
>> End Sub
>>
>> Public Shared Function GetInstance() As MySingleton
>> If m_Instance is Nothing Then
>> m_Instance = New MySingleton()
>> End If
>> Return m_Instance
>> End Function
>>End Clasee
>
>根據Head First Design Pattern的說法
>上面的方式會在GetInstance()這個function被叫用時才會建立MySingleton的物件
>下面的方式則是MySingleton可能在在GetInstance()這個function被叫用前就建立了,因為Private Shared m_Instance As New MySingleton裡的new字的關係。至於什麼時候建立,就看 .net framework 高興了
>
>書上還說啦,在multithread的情況下,上面的方法不保證建立唯一的物件
>但下面的方法還能保證建立唯一的物件
>
>>Public Class MySingleton
>> Private Shared m_Instance As New MySingleton
>> Private Sub New()
>> End Sub
>>
>> Public Shared Function GetInstance() As MySingleton
>> Return m_Instance
>> End Function
>>End Clasee
>
>然後,其實我是要來問問題的
>既然是要確保建立唯一的物件
>那麼通通都用 static 來宣告,不也是唯一嗎?為什麼不用 static 呢?
>

static variable 就不是 object(instance)了, 而是類似像 global variable
作者 : huah(Huah) C++優秀好手貼文超過200則
[ 貼文 292 | 人氣 263 | 評價 1910 | 評價/貼文 6.54 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/5/25 下午 07:33:52
第一個方法是需要時才產生物件, 第二個是直接就有了,其實我是覺得
看需要, 你甚至可以不要時也可刪除, 而且還可分GetInstance是被泛
用或只是程式一開始做設定時使用.

對廣泛使用時, 其實確實會跟static方式不易區隔, 但instance和class
在抽象的意義上還是會讓設計上的涵義不同. 一般用在系統某一控管機制.

另一種是以GetInstance()取得一個instance後keep它, 之後很少使用
GetInstance(), 這樣子, 將來如果覺得不只一個時, 用非static才可在
一開始設計之初考慮到使用member data and member functions.
會對設計的思路有些影響, 而且static member data/function有時不
會放在class的設計中, 而是以一個外顯的方式存在, 以下例而言, 有人
會不用
class A
{
    static int XXXX;
}
而用
static int XXXX;
另一個是implementation是單一的, 例如手機系統一般只有一個USB device
所以會用sigleton來確定它不會被多create, 但一般在OOD中, 它必須是
implementation的實體才能assign, 例如
UsbDevInetrface *usbDevice = OMAP850USBDevice::getInstance();
所以即使是sigleton還是不能用static member data/function.

雖然我扯了一些實際的經驗, 但我還是要強調, 使用static member data/function
和使用一般的member data/function, 在意義上就是不同的, 不能因為它只有
一個instance就使用static的member data/function. 在class中static的表徵是
class全體的.
作者 : phoenix(Phoenix)
[ 貼文 152 | 人氣 779 | 評價 940 | 評價/貼文 6.18 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/13 下午 04:56:45
>然後,其實我是要來問問題的
>既然是要確保建立唯一的物件
>那麼通通都用 static 來宣告,不也是唯一嗎?為什麼不用 static 呢?
>
為什麼不用static來建構singleton物件?
我們使用Singleton的原因除了要確保物件只能有一個外,還有一點,那就是希望物件是在需要的時候才產生,而不是一開始即產生。
當這個Singleton物件所佔用的記憶體很大的時候,使用static會在第一次參考到這個型別的時候產生此物件,而有時候我們不希望是如此,有時候我們會希望在GetInstance的時候才產生物件實體。
作者 : pantc328(好說) C#優秀好手貼文超過500則人氣指數超過10000點
[ 貼文 894 | 人氣 14154 | 評價 3400 | 評價/貼文 3.8 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/10/2 上午 11:59:52
最後一個哥哥說的還不錯,但寫程式有很多考量,合理性,合法性,你的變數要全域變數,區域變數, 變數如何切割,功能如何委派..在這裡如果用Static 是屬於 Class 的變數,相反的為 Object 或實例變數,當然如果你用 Static 是配至在推疊裡,而一般變數在Hash 裡,你放在堆疊裡是不被垃圾回收機制控管,也就是整個軟體周期都會保留,另外在資料轉形會有Box,UnBox 的動作發生
作者 : chibiya(chibiya)
[ 貼文 4 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/10/12 下午 06:52:36
>然後,其實我是要來問問題的
>既然是要確保建立唯一的物件
>那麼通通都用 static 來宣告,不也是唯一嗎?為什麼不用 static 呢?
>

使用 static 不能用來創造唯一的物件,譬如:

class NotSingleton { };
static NotSingleton a;
static NotSingleton b;

另外,實做 Singleton 還有一個要點,就是建構式必須為 global 不能存取的函式,否則妳無法阻止使用者產生另一個實體。
 板主 : Clark
 > 物件導向程式設計 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - 物件導向程式設計 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
物件導向程式設計
1 Arthur 180 
2 藍色LED 150 
3 長長 100 
4 Linkin 100 
5 love seeker 100 
6 Raymond 90 
7 Nets 80 
8 nop 70 
9 Huah 70 
10 矇矇 60 
物件導向程式設計
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.046875