1. 程式人生 > >為什麼說Singleton 模式現在成為了反模式(Anti-Pattern)?

為什麼說Singleton 模式現在成為了反模式(Anti-Pattern)?

Why implementing a Singleton pattern in Java code is (sometimes) considered an anti-pattern in Java world?

    現在,  有時會有一種觀點認為, Singleton 模式在Java code中是一個反模式。 為什麼這麼說呢?

   依賴注入

     其中的一個原因就是, 單例類不是那麼容易進行unit test, 你不能自由的控制例項化過程, 而且由於單例類的本質, 很容易造成在多個呼叫過程中的狀態跳躍。

 
     目前依賴注入的原則已經非常流行, 每個類, 當它們需要進行某種功能時, 這些依賴的類和資源是注入進來的, 而不是通過單例類的accessor 方法, 因而, 測試類可以控制使用哪個依賴類的例項, 進而有機會根據需要來提供mock。
 

     類似Spring 的開發框架會控制物件的生命週期, 並經常會提供一個單例類來使用, 但這些物件會由框架來負責注入到其他物件中, 因此基礎程式碼並不需要建立自己的單例類。
e.g. rather than this (for example)
   例如, 與其創造這個類:

public class Portfolio {
   private Calculator calc = Calculator.getCalculator();
}

  你還不如通過注入來實現:

public class Portfolio {
   public Portfolio(Calculator c) {
      this.calc = c;
   }
}

   在這裡, Porfolio 物件並不需要了解到底有多少個Calculator 物件存在, 測試程式碼可以通過注入一個Dummy的Calculator 以方便測試。

    併發

      由於只有一個物件例項的原因, 在多執行緒方面的可選擇性也會受到限制。  對單例類的訪問會被通過synchronisation 等鎖的方式受到限制。如果能維持這些物件的多個例項, 那麼就可以根據執行的執行緒的多少來決定物件的例項數量, 從而增加程式碼的容量。
  

    單一原則

   單例模式違背的單一原則: 單例類自己控制了自己的建立和生命週期。

相關推薦

為什麼說Singleton 模式現在成為了模式Anti-Pattern

Why implementing a Singleton pattern in Java code is (sometimes) considered an anti-pattern in Java world?     現在,  有時會有一種觀點認為, Singleto

設計模式之 - 模板模式Template Pattern

process egg lec pass jdbcutils ima tint new sta 引入:這幾天在看一本講spring源碼的書《SPRING技術內幕》裏面在講加載配置文件的時候,可以有不同的加載方式,如根據文件系統目錄加載配置文件(FileSystemXmlAp

【java項目實戰】代理模式Proxy Pattern,靜態代理 VS 動態代理

自己 text 好的 trace use 代理 分類 plproxy this 這篇博文,我們主要以類圖和代碼的形式來對照學習一下靜態代理和動態代理。重點解析各自的優缺點。 定義 代理模式(Proxy Pattern)是對象的結構型模式,代理模

設計模式之 - 代理模式Proxy Pattern

ride proxy idt object catch 實例化 圖片 null 人在 代理模式:代理是一種常用的設計模式,其目的就是為其他對象提供一個代理以控制對某個對象的訪問。代理類負責為委托類預處理消息,過濾消息並轉發消息,以及進行消息被委托類執行後的後續處理。很多可以

【JAVA設計模式】外觀模式Facade Pattern

簡單 產生 creat ide oid dsm ref 功能 .net 一 定義 為子系統中的一組接口提供一個一致的界面。Facade模式定義了一個高層的接口,這個接口使得這一子系統更加easy使用。 二 案例 一個子系統中擁有3個模塊。每一個模塊

7,裝飾者模式Decorator Pattern動態的給一個對象添加一些額外的職責。就增加功能來說,此模式比生成子類更為靈活。繼承關系的一個替換方案。

做到 活性 splay .com 重新 裝飾 run play 情況 裝飾( Decorator )模式又叫做包裝模式。通過一種對客戶端透明的方式來擴展對象的功能,是繼承關系的一個替換方案。 裝飾模式就是把要添加的附加功能分別放在單獨的類中,並讓這個

設計模式學習——工廠模式Factory Pattern

cto ret cas .exe on() 生產 delet 基礎 names 1、有一個工廠,專門生產不同品牌的汽車。當有人需要從此工廠提貨的時候,只需要告訴他,要什麽品牌的,就可以了,並不關心這些車是怎麽生產出來的。 2、以上方式,如果增加品牌的時候,也要修改工廠,有點

設計模式學習——代理模式Proxy Pattern

pre .cn mar str ubuntu 技術 運行 obj proxy 放假啦~學生們要買車票回家了,有汽車票、火車票,等。但是,車站很遠,又要考試,怎麽辦呢?找代理買啊,雖然要多花點錢,但是,說不定在搞活動,有折扣呢~ 1 /// 2 /// @fi

設計模式學習——代理模式Proxy Pattern之 強制代理強校驗,防繞過

arr cnblogs 其他 測試 auth using color ref use 上周溫習了代理模式:http://www.cnblogs.com/chinxi/p/7354779.html 在此進行拓展,學習強制代理。但是發現網上大多例子都有個“天坑”(我是這麽認為的

C#設計模式(23)——備忘錄模式Memento Pattern

block con 通訊 想是 multiple 數字 優缺點 引用 get 原文:C#設計模式(23)——備忘錄模式(Memento Pattern)一、引言   在上一篇博文分享了訪問者模式,訪問者模式的實現是把作用於某種數據結構上的操作封裝到訪問者中,使得操作和數

C#設計模式(20)——策略者模式Stragety Pattern

面向對象設計 top enc public 分割 集合類 標識 new library 原文:C#設計模式(20)——策略者模式(Stragety Pattern)一、引言   前面主題介紹的狀態模式是對某個對象狀態的抽象,而本文要介紹的策略模式也就是對策略進行抽象,策

C#設計模式(17)——觀察者模式Observer Pattern

oid tar 自然 img info handler 這不 自身 dash 原文:C#設計模式(17)——觀察者模式(Observer Pattern)一、引言   在現實生活中,處處可見觀察者模式,例如,微信中的訂閱號,訂閱博客和QQ微博中關註好友,這些都屬於觀察者

C#設計模式(22)——訪問者模式Vistor Pattern

line 具體實現 出現 truct 使用 需要 不同的 print mda 原文:C#設計模式(22)——訪問者模式(Vistor Pattern)一、引言   在上一篇博文中分享了責任鏈模式,責任鏈模式主要應用在系統中的某些功能需要多個對象參與才能完成的場景。在這篇博

外觀模式Facade Pattern

源代碼 任務 減少 系統 移植 computer uml類圖 auto 完成 定義: 定義了一個高層、統一的接口,外部與通過這個統一的接口對子系統中的一群接口進行訪問。 解決的問題: 避免了系統與系統之間的高耦合度 使得復雜的子系統用法變得簡單 uml類

建造者模式Builder Pattern

pub 圖片 imp 客戶端 問題 復雜 override 適合 type 定義: 將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示 解決的問題: 方便用戶創建復雜的對象(不需要知道實現過程) 代碼復用性 & 封裝性(將對象構建

工廠模式Factory Pattern

@override override 出現問題 其他 ram cto 介紹 暴露 給定 一、工廠模式(Factory Pattern)的介紹   工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。在工廠模式中,我們在創建對象時不會對客戶端暴露創建

C#設計模式之十二代理模式Proxy Pattern【結構型】

ride col 安全 .html 使用權 防火墻 一對多 tro 橋接 原文:C#設計模式之十二代理模式(Proxy Pattern)【結構型】一、引言 今天我們要講【結構型】設計模式的第七個模式,也是“結構型”設計模式中的最後一個模式,該模式是【代理模式】,英文名稱

C#設計模式之十七中介者模式Mediator Pattern【行為型】

[] 過多 深入 理解 申請 代碼實現 控制 name 缺點 原文:C#設計模式之十七中介者模式(Mediator Pattern)【行為型】一、引言 今天我們開始講“行為型”設計模式的第五個模式,該模式是【中介者模式】,英文名稱是:Mediator Pattern。還

C#設計模式之十六觀察者模式Observer Pattern【行為型】

ngx 現實生活 松耦合 mon html 機制 account current 很好 原文:C#設計模式之十六觀察者模式(Observer Pattern)【行為型】一、引言 今天是2017年11月份的最後一天,也就是2017年11月30日,利用今天再寫一個模式,爭取

C#設計模式之十一享元模式Flyweight Pattern【結構型】

eal 客戶 來看 滿足 對象狀態 英文 輔助 3.3 fig 原文:C#設計模式之十一享元模式(Flyweight Pattern)【結構型】一、引言 今天我們要講【結構型】設計模式的第六個模式,該模式是【享元模式】,英文名稱是:Flyweight Pattern。還