JAVA中23種設計模式之單例模式
阿新 • • 發佈:2019-01-26
1. 最簡單的單例模式
- 什麼叫單例模式:口語表達就是——一個類有且僅有一個物件,外部無法例項化它的新物件。只能通過呼叫的getXXX()方法來例項化物件,這個方法是自定義的。
- 最簡單的單例模式例子
2. 例如
建立一個類,將這類變成單例模式的
package demo;
//自定義的類預設情況,是非單例的
public class MyService {
//單例模式中,使用靜態的當前類的物件,來作為它的屬性
//靜態屬性
private static MyService myservice;
private MyService(){
}
/**
* 自定義新增的靜態方法,用來構造單例模式
* 不允許直接通過new一個物件來建立這個類的例項
* @return
*/
public static MyService getMyServiceInstance(){
if(myservice==null){
myservice = new MyService();
}
return myservice;
}
}
建立一個正常的類
package demo;
public class MyService_not {
public void getMyService_not(){
System.out.println("這是一個非單例模式下的構造方法" );
}
}
接下來我們來看看單例模式和普通類到底有什麼區別
寫個測試
package demo;
public class Test {
public static void main(String[] args) {
// MyService ms1 = new Myservice(); 這種直接通過new的方法建立例項是不會成功的
MyService myService1 = MyService.getMyServiceInstance();
MyService myService2 = MyService.getMyServiceInstance();
//單例模式下例項化的2個物件
System.out.println(myService1);
System.out.println(myService2);
System.out.println(myService1 == myService2);//相等true
MyService_not not1 = new MyService_not();
MyService_not not2 = new MyService_not();
//非單例模式下例項化的2個物件
System.out.println(not1);
System.out.println(not2);
System.out.println(not1==not2);//不相等 false
}
}
控制檯結果
demo.MyService@2f57d162
demo.MyService@2f57d162
true
demo.MyService_not@3639b3a2
demo.MyService_not@6406c7e
false
- 可以看到從單例模式下,例項化出來的物件是一模一樣的,而一般類例項化出的兩個物件,是在堆區開闢出兩個記憶體,將這個物件的記憶體地址傳給棧區,棧區的這個物件的引用指向開闢出來的記憶體,所以兩個物件是兩塊記憶體,兩個地址,所以不一樣,而單例模式下,是一塊記憶體。這就是單例模式的特點。
寫在後面,這是我第一次寫部落格,今年剛畢業進入軟體崗位,希望和我們一路提高自己,成為攻城獅。謝謝大家,如果覺得對親有用的話,請頂一下吧