淺談JAVASE單例設計模式
簡單的說設計模式,其實就是對問題行之有效的解決方式。其實它是一種思想。
1.單例設計模式。
解決的問題:就是可以保證一個類在內存中的對象唯一性。(單個實例)
使用單例設計模式需求:必須對于多個程序使用同一個配置信息對象時,就需要保證該對象的唯一性。
如何保證對象唯一性? 解決步驟:
1.不允許其他程序用new創(chuàng)建該對象。 1.私有化該類構造函數。
2.在該類創(chuàng)建一個本類實例。 2.通過new 在該類中創(chuàng)建一個本類對象。
3.對外提供一個方法讓其他程序可以獲取該對象。 3.定義一個公有的方法,將創(chuàng)建的對象返回。
//餓漢式(開發(fā)時常用)
class Single//類一加載,對象就已經存在了。
{
private static Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
//懶漢式(面試時常問,在多線程并發(fā)訪問時候有可能導致不能保證不了對象的唯一性,存在安全隱患?。?
class Single2//類加載進來,沒有對象,只有調用了getInstance方法時,才會創(chuàng)建對象。
//延遲加載形式。
{
private static Single2 s = null;
private Single2(){}
public static Single2 getInstance()
{
if(s==null)
s = new Single2();
return s;
}
}
//調用類
class SingleDemo
{
public static void main(String[] args)
{
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
System.out.println(s1==s2);
// Single ss = Single.s; //此處不采用這個是因為不可控,采用 Single.getInstance();可以傳參數進行相應調用。
}
}
餓漢式單例類在自己被加載時就將自己實例化。即便加載器是靜態(tài)的,在餓漢式單例類被加載時仍會將自己實例化。單從資源利用效率角度來講,這個比懶漢式單例類稍差些。從速度和反應時間角度來講,則比懶漢式單例類稍好些。
3.登記式:
代碼:
package pattern.singleton;import java.util.HashMap;import java.util.Map;
//登記式單例類.
//類似Spring里面的方法,將類名注冊,下次從里面直接獲取。
public class Singleton3 {
private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
static{
Singleton3 single = new Singleton3();
map.put(single.getClass().getName(), single);
}
//保護的默認構造子
protected Singleton3(){}
//靜態(tài)工廠方法,返還此類惟一的實例
public static Singleton3 getInstance(String name) {
if(name == null) {
name = Singleton3.class.getName();
System.out.println("name == null"+"--->name="+name);
}
if(map.get(name) == null) {
try {
map.put(name, (Singleton3) Class.forName(name).newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return map.get(name);
}
//一個示意性的商業(yè)方法
public String about() {
return "Hello, I am RegSingleton.";
}
public static void main(String[] args) {
Singleton3 single3 = Singleton3.getInstance(null);
System.out.println(single3.about());
}
}
相關文章
SpringBoot中SmartLifecycle的使用解析
這篇文章主要介紹了SpringBoot中SmartLifecycle的使用解析,SmartLifecycle是一個擴展了Lifecycle接口,可以跟蹤spring容器ApplicationContext刷新或者關閉的接口,實現該接口的實現類有特定的執(zhí)行順序,需要的朋友可以參考下2023-11-11
Spring很常用的@Conditional注解的使用場景和源碼解析
今天要分享的是Spring的注解@Conditional,@Conditional是一個條件注解,它的作用是判斷Bean是否滿足條件,本文詳細介紹了@Conditional注解的使用場景和源碼,需要的朋友可以參考一下2023-04-04
java8 filter方法、Predicate接口的使用方式
這篇文章主要介紹了java8 filter方法、Predicate接口的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07

