-
靜態方法和屬性的經典使用
-
設計模式是:在大量的實踐中總結和理論化之后優選的代碼結構、編程風格以及解決方法
什么是單例模式
-
單個實例的設計模式
-
所謂類的單例設計模式,就是采用一定的方法保證在整個的軟件系統中,對某個類只能存在一個對象的實例,並且該類只提供一個取得其對象實例的方法
單例模式的分類:
-
餓漢式
-
懶漢式
餓漢式與懶漢式的區別
-
二者最大的區別是:創建時機不同:餓漢式在類加載的時候就創建了對象實例。而懶漢式是在使用時才存在
-
餓漢式不存在線程安全問題,懶漢式存在線程安全問題-----(當多個線程同時進入判斷時)
-
餓漢式存在浪費資源的可能,因為如果程序員一個對象實例都沒有使用,那么餓漢式創建的對象就浪費了。懶漢式是使用時才創建,就不存在這個問題
-
javaSE標准類中,java.lang.Runtime就是經典的單例模式
步驟實現:
-
構造器私有化
-
類的內部創建對象
-
向外暴露一個靜態的公共方法。getInstance
代碼實現:
/**
* 餓漢式
* 1. 構造器私有化-----防止在類的外部直接創建
* 2. 在類的內部創建對象(該對象是靜態的)
* 3. 向外暴露一個靜態的公共方法。getInstance
* 他為什么是餓漢式
* 因為:
* 當調用類的靜態變量時,會導致類被加載,靜態的對象會被執行。靜態對象一執行,那么這個對象就會存在了
*/
public class SingleTon01 {
public static void main(String[] args) {
Cat instance = Cat.getInstance();
System.out.println(instance);
Cat instance1 = Cat.getInstance();
System.out.println(instance1);
//instance對象與instance1同一個對象
System.out.println(instance==instance1);//true
}
}
class Cat{
private String name;
public static int n1 = 100;
//為了在靜態方法中,返回其對象,需要將其修飾為靜態方法
//對象,通常為重量級的對象,餓漢式可以會造成創建了對象,但沒有使用,會造成資源的浪費
private static Cat cat = new Cat("小紅");
private Cat(String name) {
this.name = name;
}
public static Cat getInstance(){
return cat;
}
懶漢式
步驟:
-
1.構造器私有化
-
2.定義一個私有的靜態屬性對象
-
3.提供一個public 的static方法---中間加判斷
代碼實現:
/**
* 懶漢式
*
* 當類被調用是,不會創建對象,需要自己調用,后面再次調用,會返回上次創建的對象,從而保證了單例
*/
public class SingleTon02 {
public static void main(String[] args) {
Dog instance = Dog.getInstance();
System.out.println(instance);
//第二次調用的時候,會得到上次創建的對象
Dog instance1 = Dog.getInstance();
System.out.println(instance1);
System.out.println(instance==instance1);//true
}
}
class Dog{
private String name;
private static Dog dog;
private Dog(String name) {
this.name = name;
}
public static Dog getInstance(){
if(dog == null){
dog = new Dog("大黃");
}
return dog;
}