單例設計模式
/*
單例設計模式:一個類在內存只存在一個對象。
建立方式:兩種
第一種:餓漢式 :一開始就創建對象。開發一般用這種方法。安全
第二種:懶漢式 :調用該類時才初始化,這種方法在多線程中不安全。要注意處理 (注意:可以實現延遲加載)
創建方法:
1,將構造函數私有化。
2,在類中創建一個本類對象。
3,提供一個方法可以獲取到該對象。
*/
餓漢式實例:
class Single
{
private int age=1;
private Single(){} //1,私有化,這樣做後。。就不能使用new Single創建對象
static Single s=new Single(); //2,創建對象
public static Single getInstance(){ //3,獲取方法。注意方法名前加了個Single 類名
return s;
}
public void setage(int age){
this.age=age;
}
public int getage(){
return age;
}
}
懶漢式實例 (注意:可以實現延遲加載)
class Single
{
private Single(){}
static Single s=null;
public static synchronixed Single getInstance(){ //synchronixed 只能一個進入這斷代碼,這樣做程序效率就底了。
if(s==null) //多個線程同時調用就可能出問題,
s=new Single();
return s;
}
// 還有一種解決方法:(在有多線程時,這個比較好。)
public static Single getInstance(){
if(s==null){
synchronixed(Single.class){ //這樣就可以了,但這樣代碼太長。一般不用。可以作爲解決方法。
if(s==null)
s=new Single();
}
}
return s;
}
}
測試類:
class SingleDemo
{
public static void main(String[] args)
{
Single s1=Single.getInstance();
Single s2=Single.getInstance();
s1.setage(20);
System.out.println("只有一個類的情況下:");
System.out.println("s1="+s1.getage());
System.out.println("s2="+s2.getage()); //這樣在內存中只會有一個類的建立,s1,s2之間有關聯。
//相當於共享變量一樣。
System.out.println("可以new 多個類情況下:");
Single s3=new Single();
s3.setage(30);
System.out.println(s3.getage());
Single s4=new Single();
System.out.println(s4.getage());//這樣創建對象,對象之間沒有關聯S4輸出的就是Single類的裏的初始值
}
}