一、 概念
單例模式是一種常用的軟件設(shè)計(jì)模式。通過(guò)單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)實(shí)例而且該實(shí)例易于外界訪問(wèn),從而方便對(duì)實(shí)例個(gè)數(shù)的控制并節(jié)約系統(tǒng)資源。
二、顯然單例模式的實(shí)現(xiàn)的三個(gè)要素:
1、某個(gè)類只能有一個(gè)實(shí)例;
2、它必須自行創(chuàng)建這個(gè)實(shí)例
3、是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。
三、優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
1、實(shí)例控制
單例模式會(huì)阻止其他對(duì)象實(shí)例化其自己的單例對(duì)象的副本,從而確保所有對(duì)象都訪問(wèn)唯一實(shí)例。
2、靈活性
因?yàn)轭惪刂屏藢?shí)例化過(guò)程,所以類可以靈活更改實(shí)例化過(guò)程。
缺點(diǎn)
1、開銷
雖然數(shù)量很少,但如果每次對(duì)象請(qǐng)求引用時(shí)都要檢查是否存在類的實(shí)例,將仍然需要一些開銷??梢酝ㄟ^(guò)使用靜態(tài)初始化解決此問(wèn)題。
2、可能的開發(fā)混淆
使用單例對(duì)象(尤其在類庫(kù)中定義的對(duì)象)時(shí),開發(fā)人員必須記住自己不能使用new關(guān)鍵字實(shí)例化對(duì)象。因?yàn)榭赡軣o(wú)法訪問(wèn)庫(kù)源代碼,因此應(yīng)用程序開發(fā)人員可能忽略無(wú)法直接實(shí)例化此類。
3、對(duì)象生存期
不能解決刪除單個(gè)對(duì)象的問(wèn)題。
三、Singleton模式有三種常見形式:
第一種形式:懶漢式,也是常用的形式。
public class Student{
//1、構(gòu)造函數(shù)私有化
private Student(){
}
//2、在類中聲明一個(gè)Student對(duì)象
private static Student student;
//3、寫一個(gè)public static的方法
public static synchronized Student getStudent(){
if (Student==null) {
student=new Student();
}
return student;
}
}
第二種形式:餓漢式
public class Student {
//1、構(gòu)造函數(shù)私有化,防止外界直接實(shí)例化
private Student(){
}
//2、在類中實(shí)例化一個(gè)對(duì)象
private static Student student=new Student();
//3、寫一個(gè)public static的方法
public static Student getStudent(){
return student;
}
}
第三種形式: 雙重鎖的形式。
public static class Student{
private Student(){
}
private static Student student;
public static Student getStudent(){
if(student==null){
synchronized(Student.class){
if(null==student){
student=new Student();
}
}
}
return student;
}
}