下面是一個單例模式的實現
public class Station {
private static Station st=new Station();
private int num=10;
private Station(){
}
public static Station getInstance(){
return st;
}
public void sell(){
if (st.num>0) {
num--;
System.out.println("有票");
}else {
System.out.println("票賣沒了");
}
}
}
public class Demo {
public static void main(String[] args) {
Station st=Station.getInstance();
for (int i = 20; i >0; i--) {
System.out.print(i+"\t");
Station.getInstance().sell();
}
}
}
單例模式可以理解為是物件導向語言中對全域變數的一種實現,當然的作用不僅僅限於此。我們可以對單例模式實現的過程中的思路進行一下剖析,如此更加清楚的認識到設計模式究竟是什麼,當然也可以證明一下基礎知識的重要性(基礎才是王道)。
首先我們分析一下單例的意義,在Java中為一個類只能有一個執行個體化對象。這顯然不是我們平常所寫的一個普通類所能夠做到的事情。那麼為了實現這一個要求該如何去做呢。執行個體化是一個類的初始化時候的問題,而初始化是構造方法去做的事情(當然這裡面jvm也幫我們做了很多的事情)。構造方法,我們要設為私人。這樣我們讓該類不能被隨意的初始化,那該在哪初始化,而它有怎樣被調用呢。
一個不能初始化的類,也就是說不能夠被執行個體化的類,我們想要調用。那麼無疑讓我們想到了static關鍵字,一個public static 的方法可以實現我們這個要求——即在不執行個體化類的情況下能夠調用其中的方法。於是我們寫下了一個public static 的方法,用於得到這個類的唯一執行個體。而這個執行個體我們是在類的內部執行個體,並同樣定義為 static 的變數(一直用static 只是為了能夠不執行個體化便可以使用。因為static可以在類初始化的時候便產生了,對於此不理解的同學們可以查看我的前一篇部落格。。。)。到這裡我們一個單例模式的實現架構其實已經搭好了。
本文中的例子,sell()方法的使用是為瞭解決一個具體問題,我在單例架構下擴充而得到的。該例子的背景是有一個售票點,我們要知道自己買票的時候是否能夠買到票。顯然這是一個可以用單例模式解決的問題。因為全域只能有一個記錄票數的變數,因此我們不能夠造出多個執行個體,那樣便失去了原有的意義。於是,我們在此加上了機票數的變數num,並假使只剩下十張票。
然後,我們設立一個售票的方法,如果有票賣便列印出有票同時票的數量減一,否則列印出票賣沒了。(簡單的判斷語句)