單例與多例的差別

2021-07-27 15:11:28 字數 975 閱讀 9285

簡單理解單例多例,比如:

你用杯子喝可樂,喝完了不刷,繼續去倒果汁喝,就是單例。

你用杯子喝可樂,直接扔了杯子,換個杯子去倒果汁喝,就是多例。

單例多例需要搞明白兩個問題:

1. 什麼是單例多例;

2. 如何產生單例多例;

3. 為什麼要用單例多例

4. 什麼時候用單例,什麼時候用多例;

1. 什麼是單例多例:

所謂單例就是所有的請求都用乙個物件來處理,比如我們常用的service和dao層的物件通常都是單例的,而多例則指每個請求用乙個新的物件來處理,比如action; 

2. 如何產生單例多例:

在通用的ssh中,單例在spring中是預設的,如果要產生多例,則在配置檔案的bean中新增scope="prototype"; 

3. 為什麼用單例多例:

之所以用單例,是因為沒必要每個請求都新建乙個物件,這樣子既浪費cpu又浪費記憶體;

之所以用多例,是為了防止併發問題;即乙個請求改變了物件的狀態,此時物件又處理另乙個請求,而之前請求對物件狀態的改變導致了物件對另乙個請求做了錯誤的處理;

用單例和多例的標準只有乙個:

當物件含有可改變的狀態時(更精確的說就是在實際應用中該狀態會改變),則多例,否則單例;

4. 何時用單例?何時用多例?

對於struts2來說,action必須用多例,因為action本身含有請求引數的值,即可改變的狀態;

而對於struts1來說,action則可用單例,因為請求引數的值是放在actionform中,而非action中的;

另外要說一下,並不是說service或dao一定是單例,標準同第3點所講的,就曾見過有的service中也包含了可改變的狀態,同時執行方法也依賴該狀態,但一樣用的單例,這樣就會出現隱藏的bug,而併發的bug通常很難重現和查詢;

比如:你用杯子喝可樂,喝完了不刷,繼續去倒果汁喝,就是單例。

你用杯子喝可樂,直接扔了杯子,換個杯子去倒果汁喝,就是多例。

spring 單例與多例

id student class com.ly.entity.student init method init destroy method destroy scope singleton bean scope prototype 為多例 預設單例模式 singleton 單例模式 框架啟動時,就例...

單例模式與多例模式

共同點 建構函式私有化 有什麼用?單例設計模式的特點 多例設計模式 多例設計模式和單例一樣都需要建構函式私有化,多例是根據不同的需求返回多個單例中的指定值。a code block public class message 餓漢式 class singletonhungry 構造方法私有化 publ...

單例和多例

單例模式 兩種寫法 一.懶漢式 最簡單的寫法 怕多執行緒 中間的寫法 無法實現多執行緒 雙鎖的寫法 實現了執行緒安全,並保留了多執行緒。特點 1 單例類只能有乙個例項。2 單例類必須自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。public class user private ...