單例模式是一種常用的軟件設計模式顧名思義就是在一個程序中只存在一個實例,在它的核心結構中只包含一個被稱爲單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個實例。下面我們通過幾個方面來分部解析單例模式的實現方式。
第一步:構造方法私有化
我們在設計一個程序類時(也就是對象),在每次想要執行類中的方法時我們就需要創建一個對象,下面代碼我們來看看普通類的設計方式:
public class Person{
private int age;
private String name;
public Person(){}
public Person(int age,String name){
this.age = age;
this.name = name;
}
public void print(){
System.out.println("his/her name is "+this.name+" and age is "+this.age);
}
}
一般情況下,我們對一個類的基本操作爲讓其屬性私有化,內部的方法公有化,在創建一個對象時使用new關鍵字對其進行實例化,外部是可以看見其構造方法,並且在實例化對象時,調用其構造方法,也就是將構造方法暴露給外界,每次實例化對象時,都會生成一個新的對象。而單例模式所需要做的第一步就是,將構造方法私有化:
public class Person{
private int age;
private String name;
private Person(){}
private Person(int age,String name){
this.age = age;
this.name = name;
}
public void print(){
System.out.println("his/her name is "+this.name+" and age is "+this.age);
}
}
但是如果將構造方法私有化之後,我們進行對象的創建,此時編譯器會報錯,如圖:
提示我們構造方法爲私有的無法通過外部訪問。
第二步:在類內部構造自己
因爲我們的構造方法的訪問權限爲private,也就表明構造方法只能在類內部被創建,所以我們需要修改其內部實現:
public class Person{
private Person person = new Person();
private int age;
private String name;
private Person(){}
private Person(int age,String name){
this.age = age;
this.name = name;
}
public void print(){
System.out.println("his/her name is "+this.name+" and age is "+this.age);
}
}
但是這樣修改還是無法正常創建實例,因爲沒有個開口去返回在類中創建的實例,所以我們還需要一個方法去執行這個操作,但是我們又無法通過創建對象來獲取方法,所以需要一個靜態方法getInstance去返回實例對象,但是靜態方法是在程序加載的時候就已經實現了的,而對象person是在程序實例化時纔會生成,所以需要將實例化的操作也變成靜態的才能夠實現:
public class Person{
private static Person person = new Person();
private int age;
private String name;
private Person(){}
private Person(int age,String name){
this.age = age;
this.name = name;
}
public static Person getInstance(){
return person;
}
public void print(){
System.out.println("his/her name is "+this.name+" and age is "+this.age);
}
}
也就是將此對象生成放在靜態資源中,然後使用getInstance方法將其返回給用戶,這樣我們就實現了對象的創建,代碼如下:
由此,我們就創建了一個單例模式的對象person。
當然,單例中也分好多種模式的單例設計,還包括多線程下的線程安全問題,這個將在後續文章中進行詳細說明。
最後,對單例模式做個總結:
單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。
有三點需要注意:
1.單例類只能有一個實例。
2.單例類必須自己創建自己的唯一實例。
3.單例類必須給所有其他對象提供這一實例。