對于系統(tǒng)的一些功能組件,有一個即可,例如數(shù)據(jù)庫連接池,線程池。。。全局唯一。想要控制住對象的創(chuàng)建就用到了單例模式。
單例模式:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。

實現(xiàn)單例模式的步驟:
? ? 1、構(gòu)造方法私有化,不讓外部類創(chuàng)建對象,內(nèi)部創(chuàng)建好,賦值給變量。
? ? 2、對外提供一個方法訪問內(nèi)部創(chuàng)建好的對象。
單例根據(jù)創(chuàng)建時機(jī)又分為兩種:(1)懶漢模式,非線程安全? (2)餓漢模式
具體實現(xiàn)方式如下:
餓漢式:
1、class Single1{
????public static final Single1 INSTANCE = new??Single1();
????private Single1(){
????}
}
2、推薦,可以防止反射攻擊
enum Single2{
????INSTANCE;
}
3、
class Single3{
????private static final Single3 INSTANCE = new??Single3();
????private String info;//需要在創(chuàng)建實例對象時,讀取配置文件信息,為這個實例變量初始化
????private Single3(){
?Properties pro = new Properties();//集合,key和value都是String類型
?????????try {
? ? ? ? ? ? ? ? ?pro.load(new??FileInputStream("info.properties"));//默認(rèn)在項目根目錄
?????????} catch (IOException e) {
?????????????e.printStackTrace();
?????????}
? ? ? ? ? ? ?info = pro.getProperty("info");
????}
????//用來返回INSTANCE
????public static Single3 getInstance(){
?????????return INSTANCE;
????}
}
懶漢式:
1、class Single4{
????private static Single4 instance;//這里沒有創(chuàng)建
????private Single4(){ }
????public static Single4 getInstance(){
? ? ? ?if(instance == null){?? ?? ? //并不是每次進(jìn)入方法都需要同步
? ? ? ?synchronized (Single4.class) {
?????????????????if(instance == null){? //空的時間創(chuàng)建
?????????????????????instance = new Single4();
?????????????????}
? ? ? ?}
? ?}
?????????return instance;
? ?}
}
2、內(nèi)部類實現(xiàn)
class Single5{
????private Single5(){}
????public static Single5 getInstance(){
?????????return Inner.INSTANCE;
????}
????private static class Inner{
?????????static final Single5 INSTANCE = new??Single5();
????}
}
最后,思考如何方式反射攻擊?(通過反射獲取構(gòu)造函數(shù),然后調(diào)用setAccessible(true)就可以調(diào)用私有的構(gòu)造函數(shù))
JDK1.5之后推薦枚舉方式,可以有效防止反射攻擊。
? ?