0

問題:這個單身設計模式不好嗎?在這種情況下使用Singleton是錯誤的嗎?

爲簡單起見,我將使用一個簡單的例子。在示例應用程序中,A類讀取一些數據。

然後,A類實例化B類,然後實例化C類。因此,在所有有類3級層次結構A --> B --> C

類B創建&管理基礎上在A級中發現的數據我只是通過自定義對象,在從A類數據類-B函數/方法參數的形式。但是,C類是不同的。它有2個函數/方法給它的數據。

  1. firstMethod(arg) - 它給它的數據工作。 (在B類上呼叫)
  2. otherMethod(otherArg) - 給它與其一起工作的其他數據。

它由Class-B實例化,它需要從Class-B獲得的數據將通過firstMethod(arg1)傳遞給它傳給它的class-B。但是,還有另一個類C需要正確運行的數據集。這個其他參數與B類無關;因此,將這些信息作爲一個參數傳遞給C類似乎是錯誤的。

如何從A類到C類而不使用B類獲取這些信息? 我所做的是創建一個Singleton類-S。

S類在其中定義了A類的方法/函數(而非變量)。設置它之後,C類就可以調用它的otherMethod(otherArg)上的S-類這就要求所需要的功能,直接從A級返回所需的數據

A-->B-->C 
^  | 
|___S___| 

的問題:

我列出了網絡中出現的單身人士的一些問題。

  1. this link,它們通常用作全局實例,爲什麼那麼糟糕?因爲你在代碼中隱藏了應用程序的依賴關係,而不是通過接口公開它們。讓東西全球化,避免傳遞它是一種代碼味道。 [我的編輯] - 雖然S級被用作全局實例,但Class-c已明確定義其依賴關係。其工作所需的方法/功能在其界面中定義。
  2. from this link,它們固有地導致代碼緊密耦合。在很多情況下,這使得它們在測試中變得相當困難。 [我的編輯]這種設置仍然緊密地將C類與單身人士聯繫在一起?如果Class-C要進行單元測試,則不需要單例(至少我不這麼認爲)。由於功能是明確定義的,模擬課程可以僞造其數據。
  3. 它們在應用程序的整個生命週期中都帶有狀態。另一個打擊測試,因爲你可以結束與測試需要訂​​購的情況下,這是一個很大的單元測試不是沒有。爲什麼?因爲每個單元測試應該獨立於另一個。 [我的編輯]鑑於設置我不知道這會是一個問題?

這對任何指針都會有很大幫助。請不要討厭..我GOOGLE了,但沒有找到許多明確的答案。謝謝。有什麼想法嗎?

[我的編輯] - >以下評論提出了以下問題,我認爲重要的足以在此添加。

爲什麼你不想傳遞額外的數據到B?如果需要該數據來執行命令[in class-C],那麼它應該是一個參數。無論當B直接使用它或將其傳遞

答案是,這是使用A,B一個簡單的例子,& C.事實是該應用是複雜得多。 B類是一個可重複使用的類,用於應用程序的許多其他部分。如果我讓B類接受附加數據作爲傳遞給C類的參數,那麼在使用B類的應用程序的其他部分中,我必須通過nil作爲該參數。另外,如果在應用程序中更多的地方使用B類:B->C ... B->X ... B->Y ... B->Z ...等,那麼可重用的類B現在必須攜帶C,X的參數,Y和Z ..或更多。 B類是可以實例化不同類型的類的類,但它不知道它已經實例化/分配的類的信息。它的工作僅僅是實例/分配一個類,通過參數爲instanced-class提供它需要的一般信息,最後做一些額外的設置。但是B類不應該知道其實例類的其他具體數據。所以它不知道C級需要去A級來獲取它的信息。只有C級人員會知道從哪裏獲得其特定信息。

+0

爲什麼你不希望傳遞的附加數據爲'B'?如果需要這些數據來執行命令,那麼它應該是一個參數。無論「B」是直接使用還是傳遞它。 –

+0

@NicoSchertler我編輯了這個問題來添加你的評論,因爲我認爲這是一個很好的問題。 –

+0

好的。您的描述仍然很一般。如果你可以添加一個具體的例子,我認爲這會有很大的幫助。我很確定單身是一個壞主意。也許,B應該將C傳回給A,A可以添加必要的數據? –

回答

1

我對「產卵班」的概念有些遺憾。

你說,C有成員(即它是一個服務類?),然後讓我們說C被稱爲庫克和它有一個成員叫

Cake bakeACakeMethod(Flour,Chocolate) 

,其中巧克力是B類,您正在談論。

既然你想跳過B級,並使用一個類(菠蘿)直C,那麼你可以改變方法

Cake bakeACakeMethod(Flour,IYummy) 

凡IYummy是接口和一個B類工具IYummy,所以該方法允許這兩個類。

其他辦法做到這一點是使用超載

+0

產生一個類意味着創建一個新的類實例。類(B)遵循工廠模式:https://en.wikipedia.org/wiki/Factory_%28object-oriented_programming%29。它是創建其他類的可重用類。所以類(A)讀取初始數據,並實例化(B)。 (B)然後基於從(A)傳遞給它的數據實例化適當的類。它實例化(C)並將通用數據傳遞給它。 A,B,C類是完全獨立的類(不涉及繼承/子類)。因此(C)不能在(A)上調用方法,除非它對(A)有一些提及。我使用單例獲得參考(A) –

+0

我也編輯了上面的問題刪除單詞「衍生」,並用「實例化」類替換它 –

相關問題