1. 程式人生 > >實現單例的三種方式

實現單例的三種方式

1.懶漢模式

 1)必須在該類中,自己先創建出一個物件並私有化物件.

2)私有化自身的構造器,防止外界通過構造器建立新的物件.

3)想外暴露一個公共的靜態方法用於獲取自身的物件.

目的:保證某一個在整個應用中某一個類有且只有一個例項(一個類在堆記憶體只存在一個物件),即所有指向該型別例項的引用都指向同一塊記憶體空間。

class ArrayUtil {

   privatestatic ArrayUtilinstance =new ArrayUtil();

 

   private ArrayUtil() {

   }

 

   publicstatic ArrayUtil getInstance(){

      returninstance;

   }

 

   public void doWork() {

      System.out.println("doSomething............");

   }

}

 

public class SingletonDemo {

   publicstatic voidmain(String[] args) {

      //獲取例項

      ArrayUtil  instance = ArrayUtil.getInstance();

      //呼叫例項中的方法

      instance.doWork();

   }

}


2.懶漢模式

1)步驟跟餓漢模式差不多,不過只是在要用到時才建立物件

2 synchronized對於非static方法,同步鎖就是this.對於static方法,我們使用當前方法所在類的位元組碼物件(ArrayUtil.class).

  3) ‘雙重檢查加鎖’機制的實現會使用關鍵字volatile,它的意思是:被volatile修飾的變數的值,將不會被本地執行緒快取,

    所有對該變數的讀寫都是直接操作共享記憶體,從而確保多個執行緒能正確的處理該變數。

class ArrayUtil {

   privatestatic volatile ArrayUtil instance =null;

 

   private ArrayUtil() {

 

   }

 

   publicstatic ArrayUtil  getInstance(){

      if (instance == null) {

         //保證執行緒併發時建立的物件也是唯一的

         synchronized (ArrayUtil.class) {

            if (instance == null) {

                instance =new ArrayUtil();

                return  instance;

            }

 

         }

      }

      return  instance;

   }

 

   public void doWork() {

 

      System.out.println("doWork............");

   }

}

 

publicclassLazySingletonDemo {

   publicstaticvoid main(String[] args) {

      ArrayUtilinstance =ArrayUtil.getInstance();

      instance.doWork();

   }

}


 3.列舉模式實現

列舉來實現是絕對安全,因為反射也不能建立物件

為了更像是工具所以寫了個getInstance()方法返回列舉物件

enum  ArrayUtil {

   instance;

   public void doWork() {

      System.out.println("doSomething......");

   }

 

   publicstatic ArrayUtil getInstance(){

      returninstance;

   }

}

 

publicclass EnumSingletonDemo {

   publicstatic void main(String[] args) {

      //ArrayUtil.instance.doWork();

      ArrayUtil   instance = ArrayUtil.getInstance();

      instance.doWork();

 

   }

}


相關推薦

javascript實現繼承的方式

定義 數列 .net 一個數 str www div name type屬性 一、原型鏈繼承 function Parent(){} function Child(){} Child.prototype = new Parent(); 通過對象child的p

實現Servlet的方式(與GenericServlet、HttpServlet的關係)

WEB伺服器可以存放資料,他是一個“容器”,作用是接收使用者的請求,再對這個請求做出相應。 Java的Web伺服器必須要支援JSP/Servlet(作為JSP/Servlet的容器)。 所以JSP/Servlet就是JavaWeb伺服器的一套規範。 所以要進行J

Java實現克隆的方式

1. 淺克隆      2. 深克隆     3. 利用序列化實現深克隆 1、淺複製(淺克隆)這種淺複製,其實也就是把被複制的這個物件的一些變數值拿過來了。最後生成student2還是一個新的物件。 public class

python核心高階學習總結3-------python實現程序的方式及其區別

python實現程序的三種方式及其區別 在python中有三種方式用於實現程序 多程序中, 每個程序中所有資料( 包括全域性變數) 都各有擁有⼀份, 互不影響 1.fork()方法 ret = os.fork() if ret == 0: #子程序 else:

ionic:實現滑動的方式

1 前言   在移動端受螢幕大小所限,展示內容很多的時候,就要使部分割槽域進行滑動。本文展示專案中所有到的幾種方式,大家可以看自己的需求選擇合適的滑動方式。實現滑動的基本原理,有兩個容器A、B,假如A在外層,B在內層;外層的A寬度或高度固定,內層容器B

JavaScript面向物件()——繼承與閉包、JS實現繼承的方式

  前  言 JRedu 在之前的兩篇部落格中,我們詳細探討了JavaScript OOP中的各種知識點(JS OOP基礎與JS 中This指向詳解 、 成員屬性、靜態屬性、原型屬性與JS原型鏈)。今天我們來繼續探討剩餘的內容吧。  我們都知道,面向物件的三大特徵——封裝、繼承、多型。 封裝無非就是屬性和

【我的Java筆記】多執行緒_多執行緒實現的第方式(執行緒池)

Executors(工廠類) 方法:public static ExecutorService newFixedThreadPool(int nThreads)指定線上程池中多少條執行緒 注:此方法

實現Servlet的方式

一、實現Servlet介面 //實現servlet方法開發servlet package com.hpu.ych; import java.io.*; import javax.servlet.*; public class Hello implements Servl

form表提交方式,demo例項詳解

第一種:使用type=submit 可以直接提交<html> <head> <title>submit直接提交</title> </head> <body> <!-- 表單的提交方

程式設計實現簡訊傳送方式

2014年09月05日⁄ 綜合⁄ 共 3138字 ⁄ 字號 小 中 大 ⁄ 評論關閉 方案一: 利用sina webservice傳送簡訊 通過程式設計實現簡訊息的傳送是一件比較繁瑣的事情,目前,解決方法是通過計算機和手機的連線,使用手機程式語言編寫相關的簡訊程式來實硬體

.net 中dapper實現事務的方式總結

一個數 begin 單機 操作 不同 三種方式 ransac 方法 數據庫事務 .net 中實現事務查詢的三種方式 1.TransactionScope 通過創建TransactionScope 對象然後包裹connection對象執行相關查詢操作,完成 此種

模式實現方式

初始化 實例 得到 assm ini 0.10 文件中 base cal 1、什麽是單例模式 單例模式:基於某種方法實例化多次得到實例是同一個2、為何用單例模式 當實例化多次得到的對象中存放的屬性都一樣的情況,應該將多個對象指向同一個內存,即同一個實例3、如何用

方式實現java

java的單例模式主要分為:餓漢模式和懶漢模式 餓漢模式:餓漢很飢餓,所以直接先new出來,再提供。 餓漢模式程式碼:載入class檔案的時候就例項化。 package com.jkf.redis; public class HungryManSingleto

實現方式

1.懶漢模式  1)必須在該類中,自己先創建出一個物件並私有化物件. 2)私有化自身的構造器,防止外界通過構造器建立新的物件. 3)想外暴露一個公共的靜態方法用於獲取自身的物件. 目的:保證某一個在整個應用中某一個類有且只有一個例項(一個類在堆記憶體只存在一個物件),即所有

方式構建C#模式

同時 編譯 lec moni 單例對象 spa code exc 另一個 1 /// <summary> 2 /// 雙檢鎖實現單例 3 /// </summary> 4 public sealed

模式新談(包含方式

  設計模式是一套被反覆使用,多數人知曉,經過分類編目的,程式碼設計的總結,也可以說是前人的智慧結晶。學習設計模式能讓我們對一些應用場景使用相同的套路達到很好的效果,我會不定時更新一些自己對設計模式的理解的文章,從定義,實現,應用場景來說說設計模式,今天我要說的物件是單例模式一,定義  什麼是單例模式,字面理

阿里P7講解JAVA中實現(Singleton)模式的八方式

單例模式 單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個例項。即一個類只有一個物件例項。 基本的實現思路 單例模式要求類能夠有返回物件一個引用(永遠是同一個)和一個獲得該例項的方法(必須是

JAVA實現模式方法(二):使用靜態內部類實現設計模式

靜態程式碼塊和靜態內部類的載入順序:當呼叫外部類的建構函式是,外部類的靜態程式碼塊同時被載入,但是其內部類不會同時被載入;當且僅當內部類的靜態域或其構造方法或其靜態方法被呼叫時,內部內才被載入。 因此,通過內部內實現單例,就能實現延遲載入。 這個解決方案被稱為Lazy i

java中實現模式的幾方式,簡單易懂

一、餓漢式單例類 public class Singleton { private Singleton(){ } private static Singleton instance = new Singleton();

Swift 四實現方式

單例模式 單例模式是設計模式中最簡單的一種,甚至有些模式大師都不稱其為模式,稱其為一種實現技巧,因為設計模式講究物件之間的關係的抽象,而單例模式只有自己一個物件。 當你只需要一個例項的時候需要使用單例,如UIApplication.sharedApplication() 等 ,