2016-04-27 82 views

回答

3

對於一個類是「打開」的,它必須有可能從它繼承。繼承是一種「是一種」關係。如果您從單例類繼承,那麼由於「is-a」關係,子類的實例也是父類的實例,這意味着您可以突然擁有多個單例類的實例。

如果單例類禁止繼承,它不再是「開放」的。

如果單例類允許繼承,並且對於擴展是「打開」的,那麼它不能再強制單例模式。

1

有兩個問題與Singleton模式:

  • 它打破了開/關的原則,因爲單例類本身就是在創造它的實例的控制,而其他有它硬依賴。這不允許更改另一個實現,而不必在整個應用程序中進行徹底的更改。
  • 它打破了依賴倒置原則,因爲消費者總是直接依賴具體的類來獲得實例,而DIP則說我們應該依賴抽象。這會導致單例執行被拖動,並且不允許通過將實現封裝在裝飾器中或分發沒有單例實現的客戶端來增加橫切關注點。
+0

難道一個singleton實現一個接口來解決這兩個問題嗎?該接口保持打開狀態以進行擴展,而取決於接口的客戶端不需要知道它們都是在抽象背後使用單例實例。 – jaco0646

+0

如果它具有接口並且'Instance'可以替換,那麼這將不是Singleton模式,並且'Instance'屬性仍然會在靜態類中定義,這會導致DIP被違反。 – Steven