單例模式,也交單子模式,有時候系統(tǒng)只需要擁有一個全局對象。
這種模式涉及到一個單一的類,該類負責(zé)創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。
一個類的返回對象一個引用(并且還是同一個)和一個獲得該實例的方法(通常是getInstance)
如果調(diào)用這個方法為空的話,就創(chuàng)建一個實例;如果調(diào)用這個方法不為空的話,就返回這個引用。
public class SingleObject { //創(chuàng)建 SingleObject 的一個對象 private static SingleObject instance = new SingleObject(); //讓構(gòu)造函數(shù)為 private,這樣該類就不會被實例化 private SingleObject(){} //獲取唯一可用的對象 public static SingleObject getInstance(){ return instance; } public void showMessage(){ System.out.println("Hello World!"); }}
public class SingletonPatternDemo { public static void main(String[] args) { //不合法的構(gòu)造函數(shù) //編譯時錯誤:構(gòu)造函數(shù) SingleObject() 是不可見的 //SingleObject object = new SingleObject(); //獲取唯一可用的對象 SingleObject object = SingleObject.getInstance(); //顯示消息 object.showMessage(); }}
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
instance就是一個靜態(tài)對象,在全局是唯一的,在內(nèi)存空間上是固定的。
A,靜態(tài)對象的數(shù)據(jù)在全局是唯一的,一改都改。如果你想要處理的東西是整個程序中唯一的,弄成靜態(tài)是個好方法。 非靜態(tài)的東西你修改以后只是修改了他自己的數(shù)據(jù),但是不會影響其他同類對象的數(shù)據(jù)。
B,引用方便。直接用 類名.靜態(tài)方法名 或者 類名.靜態(tài)變量名就可引用并且直接可以修改其屬性值,不用get和set方法。
C,保持?jǐn)?shù)據(jù)的唯一性。此數(shù)據(jù)全局都是唯一的,修改他的任何一處地方,在程序所有使用到的地方都將會體現(xiàn)到這些數(shù)據(jù)的修改。有效減少多余的浪費。
D,static final用來修飾成員變量和成員方法,可簡單理解為“全局常量”。對于變量,表示一旦給值就不可修改;對于方法,表示不可覆蓋。參考
在軟件開發(fā)中也常常遇到類似的情況,實現(xiàn)某一個功能有多種算法或者策略,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的算法或者策略來完成該功能。
簡而言之,人說人話,鬼說鬼話。
如果我做A,就用A的相關(guān)算法
如果我做B,就用B的相關(guān)算法
我們可以有幾個策略可以考慮:可以騎自行車,汽車,做火車,飛機。每個策略都可以得到相同的結(jié)果,但是它們使用了不同的資源。選擇策略的依據(jù)是費用,時間,使用工具還有每種方式的方便程度 。
某系統(tǒng)提供了一個用于對數(shù)組數(shù)據(jù)進行操作的類,該類封裝了對數(shù)組的常見操作,
如查找數(shù)組元素、對數(shù)組元素進行排序等。現(xiàn)以排序操作為例,使用策略模式設(shè)計該數(shù)組操作類,
使得客戶端可以動態(tài)地更換排序算法,可以根據(jù)需要選擇冒泡排序或選擇排序或插入排序,
也能夠靈活地增加新的排序算法。
想要看到更多瑋哥的學(xué)習(xí)筆記、考試復(fù)習(xí)資料、面試準(zhǔn)備資料?想要看到IBM工作時期的技術(shù)積累和國外初創(chuàng)公司的經(jīng)驗總結(jié)?
敬請關(guān)注: