1.設計模式:23種設計模式。對問題行之有效的解決方式。其實它是一種思想。
2.單例設計模式:就是可以保證一個類在內存中的對象唯一性。
解決辦法:
步驟:
1)私有化該類的構造函數。
2)通過new在本類中創建一個本類對象
3)定義一個公有的方法,將創建的對象返回。
代碼例子:
1.餓漢式:一上來就吃
/*
設計模式:23種設計模式。對問題行之有效的解決方式。其實它是一種思想。
1.單例設計模式。
解決的問題:就是可以保證一個類在內存中的對象唯一性。
比如說對於多個程序使用同一個配置信息對象時,就需要保證該對象的唯一性。
如何保證對象的唯一性?
1)不允許其他程序用new創建該類對象。
2)在該類中創建一個本類實例。
3)對外提供一個方法讓其他程序可以獲取該對象。
步驟:
1)私有化該類的構造函數。
2)通過new在本類中創建一個本類對象
3)定義一個公有的方法,將創建的對象返回。
*/
class Single //類一加載,對象就已經存在了
{
private Single(){};
private static Single s = new Single(); //成員變量一般不暴露出去
public static Single getInstance() //這個方法存在是賦予對象的可控性
{
return s;
}
}
class SingleDemo
{
public static void main(String[] args)
{
Single ss = Single.getInstance();
Single s1 = Single.getInstance();
System.out.println(ss == s1);
//Single ss = Single.s; //這樣對象沒有可控性
Test t1 =Test.getInstance();
Test t2 =Test.getInstance();
t1.setNum(10);
t2.setNum(20);
System.out.println(t1.getNum());
System.out.println(t2.getNum());
}
}
class Test
{
private int num;
private Test(){};
private static Test t = new Test();
public static Test getInstance()
{
return t;
}
public void setNum(int num)
{
this.num = num;
}
public int getNum()
{
return num;
}
}
3.單例設計模式內存分析:
4.另一種表現模式:延遲加載形式,面試這個問得比較多。(懶漢式:用的時候再做)
class Single2 //類加載進來,沒有對象,只有調用了getInstance方法時,纔會創建對象。
//稱爲延遲加載形式
{
private Single2(){};
private static Single2 s = null;
private static Single2 getInstance()
{
if(s == null)
s = new Single2();
return s;
}
}
5.注意:
面試時,問懶漢式比較多,知識點較多。
開發時,用餓漢式:
1.因爲單例這個類就是要用對象,所以先加載後加載沒區別。
2.懶漢式存在問題:如果被多線程併發訪問時,可能保證不了對象的唯一性,有安全隱患。想保證要改,改了之後效率也降低了。