單例模式
Q:什麼是單例模式呢?
A:單例模式確保某個類只有一個實例大家想用這個類的對象的時候只能拿到一個共同的實例單例類要自行創建實例
Q:為什麼要用到單例模式?
A:如果有一個復雜的類我們總要使用它的對象那我們豈不是總要new這個對象這樣會消耗我們的內存所以我們要選用單例模式
下面通過一個簡單的例子說明單例模式的實現方法
//普通的類通過new來創建新的對象每次創建都會得到不同的實例
public class SingletonDemo{
//構造方法
public SingletonDemo(){}
//普通方法
public void singleLove(){
Systemoutprintln(Persist for you!)
}
}
//使用第一種方式的單例模式類通過公共屬性來創建對象
public class SingletonDemo{
//第一種實現單例模式的方法通過公共屬性來實現實例化
//聲明一個公共的靜態屬性使只被實例化一次
public static final SingletonDemo singletonDemo = new SingletonDemo()
//聲明一個私有的構造方法使別人不能隨便new對象
private SingletonDemo(){}
//普通的方法
public void singleLove(){
Systemoutprintln(Always persist for you!)
}
}
//使用第二種方式的單例模式類通過getInstance()來創建對象
public class SingletonDemo{
//第二種實現單例模式的方法通過方法來實現實例化
//聲明一個私有的靜態屬性使只被實例化一次
private static final SingletonDemo singletonDemo = new SingletonDemo()
//聲明一個私有的構造方法使別人不能隨便new對象
//它只被調用一次實例存在之後就不再調用了
private SingletonDemo(){}
//聲明一個公共的靜態方法外界通過調用這個方法來得到唯一的實例
public static SingletonDemo getInstance(){
return singletonDemo;
}
//普通的方法
public void singleLove(){
Systemoutprintln(Persist for you always!)
} }
public class Test{ //測試方法 public static void main(String[] args){
//測試
SingletonDemo singleton = new SingletonDemo()
singletonsingleLove()
SingletonDemo singleton = new SingletonDemo()
singletonsingleLove()
boolean flag = singletonequals(singleton)
Systemoutprintln(用equals的方法來判斷)
Systemoutprintln(此時的flag= + flag)
if(flag){
Systemoutprintln(他們的內存地址是一樣的哦這說明他們是同一個實例實現了單例模式!)
}else{
Systemoutprintln(他們的內存地址不一樣則說明他們是不同的實例)
}
//測試
SingletonDemo singleton = SingletonDemosingletonDemo;
singletonsingleLove()
SingletonDemo singleton = SingletonDemosingletonDemo;
singletonsingleLove()
int addr = singletonhashCode()
int addr = singletonhashCode()
Systemoutprintln(用hashCode來判斷)
if(addr == addr){
Systemoutprintln(內存地址是一樣的哦則說明他們是同一個實例實現了單例模式)
}else{
Systemoutprintln(他們的內存地址不一樣則說明他們是不同的實例)
}
//測試
SingletonDemo single = SingletonDemogetInstance()
singlesingleLove()
SingletonDemo single = SingletonDemogetInstance()
singlesingleLove()
boolean flag = singleequals(single)
Systemoutprintln(用equals來判斷)
Systemoutprintln(此時的flag= + flag)
if(flag){
Systemoutprintln(內存地址是一樣的哦則說明他們是同一個實例實現了單例模式)
}else{
Systemoutprintln(他們的內存地址不一樣則說明他們是不同的實例)
}
} }
說明根據個人使用經驗推薦使用方法三
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26571.html