1. 程式人生 > >【java設計模式初探0】_單例模式

【java設計模式初探0】_單例模式

在java的幾十種設計模式中,可能單例模式算是最容易理解的吧!因為不論是目前的我自己,還是偶爾面試的別人,能稍微講清楚的,基本就是單例模式。
什麼叫單例模式?顧名思義,就是單一的例項,唯一的例項。也就是說對於某個java類來說,他的例項物件最多隻能建立一個。

那麼,稍微有點java基礎的同學都知道,我們自己建立物件最基本的方式就是使用new關鍵字,通過類定義的構造器來建立。就比如有這樣一個類:

public class Earth{
  public Earth(){

   }
}

我們自己建立該類的物件,一般就是new Earth(),那麼很顯然的,這種情況下我們每new一次,這個類就會有一個新的物件例項。
如此一來,也就是說只要這個類有了可以供外部呼叫的構造器,那麼就必然無法控制這個類的例項個數。
也就是說,如果我們希望這個類的例項只有一個,就必須把類的構造器訪問許可權設定成private,使得外部無法呼叫

。就如下邊這樣:

public class Earth{
 private Earth(){

   }
}

那麼問題又來了,既然類的構造器都是private,那麼我們又該如何建立這個類的例項物件呢?
這時候就需要知道一個基礎的知識點:實際上在java中建立物件,歸根結底都只能使用構造器建立,不論是使用框架(框架內部)還是直接使用普通程式碼!
也就是說,即使這個類的構造器是private的,我們也還是隻能使用類構造器來建立這個類的例項物件。
如此一來,便又涉及到一個java很基礎的知識點,我們知道private修飾的方法只有當前類才能使用,那麼很顯然的,對於構造器是private的類,我們也就只能在這個類的內部建立類的例項物件了。

public class Earth{
 private Earth(){

   }
  Earth earth=new Earth();
}

那麼問題又來了,看起來我們在當前類中建立了一個該類的例項物件,但是我們知道java中非static修飾的變數是屬於物件的,而這裡我們並不能在外部建立類的例項物件,那麼就還是無法獲取到我們自己建立的例項。
怎麼辦呢?此時外部能訪問的只有這個類本身,那麼如果要外部能獲取到我們在類中建立的例項,就只能使這個例項是屬於類的,也就是說需要讓它變成static。

public class Earth{
 private Earth(){

   }
 static
Earth earth=new Earth(); }

好了,這樣一來,實際上一個基本的單例就算是實現了,我們已經保證了這個類只會有一個例項物件,直接使用Earth.earth來獲取就好了。
但是呢,這並不是我們要說的單例模式的規範寫法。因為在java規範中,類的屬性一般是需要對外隱藏的,也就是說這個自己建立的例項物件也需要宣告為private

public class Earth{
 private Earth(){

   }
private static Earth earth=new Earth();
}

這樣的話,我們外部似乎又沒法獲取到這個類的物件了,怎麼辦呢?那就只能提供一個對外公開的方法,讓外部能根據這個方法來獲取到類的物件例項。當然了,這個方法自然也是要屬於類的,這樣才能在沒有物件多的情況下呼叫:

public class Earth{
 private Earth(){

   }
private static Earth earth=new Earth();
public static Earth getInstance(){
     return earth;
}

好了,到了這裡,我們一個比較規範的單例模式的類便算是真正的完成了,既可以保證這個類的例項是單一的,又遵循了基本的java規範。
總結一下就會發現其實就是三個簡單而必須的步驟:
一、構造器私有化
二、自己建立自己的私有並且靜態的例項物件
三、提供一個外部能訪問的靜態方法,返回自己的例項物件
上邊這種模式,被稱為單例模式中的餓漢式。
何為餓漢?餓,可以理解為迫不及待,也就是等不及要吃東西。放在我們程式碼中,就是說在一開始就建立了例項物件,編譯完就立馬初始化了這個例項物件。

那麼除開餓漢式,還有一個很常用的就是懶漢式了(實際還有一個雙重鎖模式,這裡暫時不談),基本程式碼如下:

public class Earth{
 private Earth(){

   }
private static Earth earth=null;
public static Earth getInstance(){
     if(earth==null){
        earth=new Earth();
      }
     return earth;
}

和上邊餓漢式的區別在於,並沒有在定義Earth變數的時候就給他初始化,而是給了一個初始值null。只不過這裡雖然顯示的寫了null,實際上是可以不寫的。
因為即使我們不顯示的給,在這個類編譯完之後也會給所有的變數初始化賦值,基本型別有各自獨特的初始值,比如int型別的是0,而引用型別的預設初始值都是null
與此同時,我們把具體物件的例項化放在了提供給外部呼叫的方法中,並且做了一定的判斷,只有當這個物件是null的時候才會建立一個物件。
這裡的判斷是很必要的,如果不做判斷,那麼每呼叫一次就是一個新的物件,無法保證單一例項,跟直接構造器建立就沒了區別
那麼有了程式碼,懶漢式也就比較好理解了。何謂懶漢?懶,就是做什麼事都要一拖再拖,直到非做不可的時候才做。放在我們程式碼中,也就是在必須要獲取例項物件的時候才會建立一個例項,在第一次呼叫getInstance方法的時候才會建立例項。

單例模式很簡單,在實際專案中也應用非常的廣泛。例如某些資料量很小的,直接定義死的,但是有時候可能因為業務需求的變化需要手動改變的一些公用資料,我們就可以不放在資料庫,而是直接放在配置檔案中,然後在專案中載入一次,放到記憶體中。

相關推薦

java設計模式初探0_模式

在java的幾十種設計模式中,可能單例模式算是最容易理解的吧!因為不論是目前的我自己,還是偶爾面試的別人,能稍微講清楚的,基本就是單例模式。 什麼叫單例模式?顧名思義,就是單一的例項,唯一的例項。也就是說對於某個java類來說,他的例項物件最多隻能建立一個。

Python設計模式02 模式

1. python實現經典的單例模式 python通過覆蓋__new__()方法來控制物件的建立。 if not hasattr(cls, ‘instance’):方法hasattr用於檢視物件cls是否具有屬性instance, 該屬性的作用是檢查該類是否已經生成了一個物件。

Java23種設計模式1----》模式

23種模式分類: 模式:固定的套路 面向物件重要的模式 一、原理 保證一個類只有一個物件,並且提供一個全域性的訪問點 二、應用場景 三、優點 記憶體佔用小  四、最好擁有的特點 執行緒安全,呼叫效率高,懶載入----》推薦使用靜態內部類實現 五、常

php利用模式設計資料庫連線Model類

之前在《【php】利用php的建構函式與解構函式編寫Mysql資料庫查詢類》(點選開啟連結)寫過的Mysql資料庫查詢類還不夠完美,利用《【Java】單例模式》(點選開啟連結)介紹的思想可以將這個資料庫連結類搞成單例,不會因為多個使用者訪問網站就建立一個數據庫查詢例項,拖慢

JS 設計模式 模式(Singleton)來封裝對資料的增刪除改查

單例模式單例模式的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個例項單例模式最初的定義出現於《設計模式》(艾迪生維斯理, 1994):“保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。”單例模式定義:“一個類有且僅有一個例項,並且自行

設計模式_創建型模式_模式_案例

輸出結果 tel pattern 對象 技術 圖片 保存 null urn 轉載自:http://blog.csdn.net/lovelion 作者:劉偉 負載均衡器的設計與實現 Sunny公司開發人員通過分析和權衡,決定使用單例模式來設計該負載均衡器,結構圖如圖3

Java 設計模式系列(五)模式

重要 理解 iat 版本 ide 默認 ces 內部實現 成功 Java 設計模式系列(五)單例模式 單例模式確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 一、懶漢式單例 /** * 懶漢式單例類.在第一次調用的時候實例化自己 * 1. 構造器私

設計模式 _第一招式_模式

一、定義 單例模式(Singleton Pattern)是一個比較簡單的模式,確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 二、程式碼演示 Singleton 類稱為單例類,通過使用private的建構函式確保在一個應用中只產生一個例項,並且自行例項化,單例

設計模式_模式

對象 pre dconf 分類 好的 file 內存 new unique 1.面向對象,變化隔離出來,壓縮到最小 類與對象的交互。 模式分類: 1.從目的來講: 1.創建型:負責創建對象 2.結構型:處理類與對象之間的組合 3.行為型:類與對象交互中的職責分配。 2.從範

Java 設計模式(四):模式

參考連結:單例模式-Singleton Pattern 對於一個軟體系統的某些類而言,我們無須建立多個例項。舉個大家都熟知的例子——Windows工作管理員,如圖所示: 通常情況下,無論我們啟動任務管理多少次,Windows系統始終只能彈出一個工作管理員視窗。為什麼要這樣設計呢?我

Velocity官方指南使用模式還是非模式

譯者:大胃  原文連結 從Velocity 1.2以後的版本,開發者對於Velocity引擎的使用有了兩種方式,單例模型(Singleton)以及多個獨立例項模型。Velocity的核心部分也採用了這兩種模型,目的是為了讓Velocity可以更容易與你的JAVA應用相整合。 單例模式(Sin

(GOF23設計模式)_模式_雙重檢查鎖式_靜態內部類式_列舉式

設計模式 a、建立型模式 單例模式、工廠模式、抽象工廠模式、建造者模式、原型模式 b、結構型模式 介面卡模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式 c、行為型模式 模板方法模式、命令模式、迭代器模式、觀察者模式、中介

Java設計模式(一):模式,防止反射和反序列化漏洞

package com.iter.devbox.singleton; import java.io.ObjectStreamException; import java.io.Serializable; /** * 靜態內部類實現方式(也是一種懶載入方式) * 這種方式:執行緒安全,呼叫效率高,並且實

JAVA設計模式(3):模式

單例(Singleton)模式是Java中最簡單的設計模式之一。這種型別的設計模式屬於建立模式,因為此模式提供了建立物件的最佳方法之一。這種模式涉及一個類,它負責建立一個物件,同時確保只建立一個物件。這個類提供了一種方法來訪問它的唯一物件,可以直接訪問,而不需要例項化類的物件。 實現例項 我

機房合作模式的實現

合作的時候需要用到單例模式,於是就專門學了一下 正文 程式碼如下 #region 單例模式 private static frmMainUser MainUser = null;//宣告一個靜態的類變數 private frmMainUse

《大話設計模式》讀書筆記:模式Java同步鎖synchronized

單例模式,保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。在單例模式下,類本身負責儲存它的唯一例項,這個類必須保證沒有其他例項可以被建立,並且它可以提供一個訪問該例項的方法。單例模式的類中,構造方法(函式/體)被設為private,從而堵死了外部例項化該類的可能。同

設計模式(一):模式 java實現

參考:http://blog.csdn.net/jason0539/article/details/23297037/ 單例模式:指的是一個類只有一個例項物件。它的設計是為了實現類的單一功能。專注於自己的事情。 有如下三個特點: 單例類只有一個

設計模式(一):單例模式 JVM類載入機制 JDK原始碼學習筆記——Enum列舉使用及原理 Java併發(七):雙重檢驗鎖定DCL Java併發(二):Java記憶體模型 Java併發(二):Java記憶體模型 Java併發(七):雙重檢驗鎖定DCL JDK原始碼學習筆記——Enum列舉使用及原理

單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許一個例項存在。 單例模式一般體現在類宣告中,單例的類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。 適用場合: 需要頻繁的進行建立和銷燬的物件; 建立物

Java設定模式_建立型_模式_只存在一個例項

1.餓漢式   單例設計模式的寫法存在很多種,常用的寫法可分為懶漢式、餓漢式和登記式。   餓漢式是在類被載入時就已經被例項化,但是對於大的物件,例項化會很消耗資源,因此對於大物件不建議通過該種方式實現單例模式。 public class Sing

java設計模式(1/23)-模式(Singleton pattern)

java建立型模式之一: 單例模式(Singleton pattern) 什麼是設計模式? 是一套被反覆使用、多人知曉的、經過分類編目的程式碼設計經驗的總結。 使用設計模式是為了可重用程式碼,讓程式碼更容易被他人理解、保證程式碼的可靠性。 有些物件我們只需要一個,比如: