設計模式之Singleton模式和Strategy模式是什麼
Singleton模式
單例模式,也交單子模式,有時候系統只需要擁有一個全域性物件。
這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。
一個類的返回物件一個引用(並且還是同一個)和一個獲得該例項的方法(通常是getInstance)
如果呼叫這個方法為空的話,就建立一個例項;如果呼叫這個方法不為空的話,就返回這個引用。
public class SingleObject { //建立 SingleObject 的一個物件 private static SingleObject instance = new SingleObject(); //讓建構函式為 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) { //不合法的建構函式 //編譯時錯誤:建構函式 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就是一個靜態物件,在全域性是唯一的,在記憶體空間上是固定的。
A,靜態物件的資料在全域性是唯一的,一改都改。如果你想要處理的東西是整個程式中唯一的,弄成靜態是個好方法。 非靜態的東西你修改以後只是修改了他自己的資料,但是不會影響其他同類物件的資料。
B,引用方便。直接用 類名.靜態方法名 或者 類名.靜態變數名就可引用並且直接可以修改其屬性值,不用get和set方法。
C,保持資料的唯一性。此資料全域性都是唯一的,修改他的任何一處地方,在程式所有使用到的地方都將會體現到這些資料的修改。有效減少多餘的浪費。
D,static final用來修飾成員變數和成員方法,可簡單理解為“全域性常量”。對於變數,表示一旦給值就不可修改;對於方法,表示不可覆蓋。 參考
Strategy 模式
在軟體開發中也常常遇到類似的情況,實現某一個功能有多種演算法或者策略,我們可以根據環境或者條件的不同選擇不同的演算法或者策略來完成該功能。
簡而言之,人說人話,鬼說鬼話。
如果我做A,就用A的相關演算法
如果我做B,就用B的相關演算法
EX:出行旅遊
我們可以有幾個策略可以考慮:可以騎自行車,汽車,做火車,飛機。每個策略都可以得到相同的結果,但是它們使用了不同的資源。選擇策略的依據是費用,時間,使用工具還有每種方式的方便程度 。
Ex:排序策略
某系統提供了一個用於對陣列資料進行操作的類,該類封裝了對陣列的常見操作,
如查詢陣列元素、對陣列元素進行排序等。現以排序操作為例,使用策略模式設計該陣列操作類,
使得客戶端可以動態地更換排序演算法,可以根據需要選擇氣泡排序或選擇排序或插入排序,
也能夠靈活地增加新的排序演算法。
想要看到更多瑋哥的學習筆記、考試複習資料、面試準備資料?想要看到IBM工作時期的技術積累和國外初創公司的經驗總結?
image
敬請關注: