1. 程式人生 > >java中最嚴謹的單例模式的實現方式

java中最嚴謹的單例模式的實現方式

現在很多有關java的書籍、視訊、部落格等有講解java中的單例模式的實現,但是遺憾的是,很多講的都不是完全嚴謹的。

java中一個嚴謹的單例模式應該包含以下幾個方面:

1.有一個private型別靜態例項,從而防止從外部直接訪問;

2.建構函式必須是private的,防止外部使用建構函式進行例項化產生新的物件;

3.擁有一個靜態工廠方法,而且必須是同步的,從而防止多執行緒環境下同時執行;該方法返回前面定義的例項物件;

4.必須重寫clone方法,並返回當前例項物件(預設的clone()方法會建立新的例項物件)。

/**
 * @author xiaoyang
 * 單例模式
 */
public class SingletonFactory {
	
	private volatile static SingletonFactory instance;//volatile防止java記憶體模型的無序寫入的問題
	
	private SingletonFactory() {
	}
	
	public  static SingletonFactory getInstence(){
		//雙重檢查加鎖
		if(instance==null){
			synchronized(SingletonFactory.class){
				if(instance==null){
					instance=new SingletonFactory();
				}
			}
		}
		return instance;
	}
	
	//必須重寫clone方法,返回該單例。否則呼叫clone方法會產生新的例項。
	@Override
	protected SingletonFactory clone() throws CloneNotSupportedException {
		return instance;
	}
	
}



相關推薦

JAVA的餓漢式和飽漢式模式及jdkRuntime類的模式實現方式詳解

一、描述 單例模式是一種非常常見的設計模式,即一個類只能有一個物件(例項),一般通過將該類的構造器私有化,來阻止在該類外建立該類的物件,並提供給外界一個唯一的物件(這個物件在該類中建立)。        java中的單例模式常見的有兩種實現方式,一種是惡漢方式,即將該類物件

java模式實現方式總結

public class SingletonObject1 { private static final SingletonObject1 singletonObject1 = new SingletonObject1(); private SingletonObject1(){}

模式實現方式

轉自https://www.cnblogs.com/rjzheng/p/8946889.html先看一副漫畫:OK,回顧一下小灰的遭遇,上述漫畫中所提出的那些問題主要有以下三點:    1.為什麼靜態內部類的單例模式是最推薦的?    2.如何在反射的情況下保證單例?    

java嚴謹模式實現方式

現在很多有關java的書籍、視訊、部落格等有講解java中的單例模式的實現,但是遺憾的是,很多講的都不是完全嚴謹的。 java中一個嚴謹的單例模式應該包含以下幾個方面: 1.有一個private型別靜態例項,從而防止從外部直接訪問; 2.建構函式必須是private的,防止

Java模式實現

java 單例模式 只能生成一個實例的類是實現了Singleton(單例)模式的類。以下為C#實現單例模式的方式方式一只使用於單線程環境// 把構造函數設為私有函數以禁止他人創建實例 // 定義一個靜態的實例,在需要的時候創建該實例 // 在Singleton的靜態屬性Instance中,只有

JAVA模式實現詳解

單例模式的特點 類的內部包括待返回的類的例項,為private static型別 類的建構函式為私有建構函式,以防止在其他類中例項化,private的作用是防止在其他類中用建構函式建立該類的例項 提供一個獲取例項的靜態方法 單例模式1:飽漢模式+考慮了執

Java模式實現的幾種方法

package offer; public class Test02 { /** * 01 餓漢模式 執行緒安全 */ public static class Singleton{ private final static Singleton

簡單好用安全的模式實現

使用內部類實現  package com.zz.amqp1.multithread; /** * Description: 最簡單好用的單例 * User: zhouzhou * Date: 2018-11-05 * Time: 15:50 */ public

Java多執行緒-----模式在多執行緒的使用用問題

   1.餓漢模式(立即載入模式)與多執行緒 不管需不需要用到例項都要去建立例項,即在類產生的時候就建立好例項 package com.thread; /** * 餓漢模式 * * @author yyx 2018年12月28日 */ public cl

Java多執行緒--模式的五種實現

一、惡漢模式 在這個類還沒有使用到的時候就已經建立好了 public class Singleton{ /** *類變數在類準備階段就初始化了然後放在<clinit>構造方法中, *一旦外部呼叫了靜態方法

RedisUtil工具類,Java模式實現

基於Java單例模式和Jedis封裝的RedisUtil,提供了Redis中的Key、字串、Hash、ZSet等的操作。 package com.cumt.tools.redis; import com.alibaba.fastjson.JSON; im

PHP模式實現

  class SingleInstance{                private function _construct(){                    }               private static $instance;              private fun

7模式實現小結

原子 vol 暫時 socket static data instance 改進 cli import java.net.Socket; import java.sql.Connection; public class Test { public st

[js高手之路]設計模式系列課程-模式實現模態框

ges 點擊 eat abs select nbsp str osi 控制 什麽是單例呢? 單,就是一個的意思。例:就是實例化出來的對象,那合在一起就是保證一個構造函數只能new出一個實例,為什麽要學習單例模式呢?或者說單例模式有哪些常見的應用場景.它的使用還是很廣泛,比如

模式實現

鎖定 word nal ron 單例模式 tin public 原子操作 == 靜態內部類(static nested class) 優先考慮 public class LazySingleton{ private LazySingleton(){}

java反射(java.lang.reflect) ---普通模式唯一性問題

catch 調用 ant 餓漢 urn 方法 -- ace ati 1. 普通的飽漢式、餓漢式 package org.bighead.test2; public class TestPrivate { private String str = "strPrivate

python的四中模式

attr method ask 支持 object @class pre acl print 1 # 單例模式:無法支持多線程情況 2 """ 3 class Singleton(object): 4 def __init__(self): 5

c#之使用模式實現數據庫連接

strings instance ssl div lock config onf 鎖定 特殊 1、使用程序集Oracle.ManagedDataAccess.dll using Oracle.ManagedDataAccess.Client; using System.Co

模板方法模式 + 觀察者模式 + 簡單工廠模式 + 模式實現一個簡單的數據表讀寫

private 數據庫鏈 obs imp 通知 model 數據表 ring pri 實現功能: 對數據表的讀要緩存起來,對數據表的寫需要清除緩存. 數據表根據屬性字段來決定是否緩存 可以更換數據庫鏈接方式,比如可以隨時更換為mysql或mysqli() 當插入數據時給出一

設計模式模式實現(C++)

pan sin ace pen bsp ati one delet friend #ifndef SINGLETON_H #define SINGLETON_H #include <cassert> #include <memory> #incl