今天上課的時候老師開始講23個設計模式,爲加深印象,特開一篇文章來作記錄。
其中參考《大話設計模式》以及上課的例子(java),後期會補充關於js的應用java
(使用場景:繪圖程序中的工具箱,無需每次點擊按鈕都從新建立一個工具箱對象)
單例模式與實用類(例如Math)的區別:實用類不保存狀態,僅提供靜態方法或靜態屬性來使用,而且不能用於集成多態。單例是有狀態的,容許子類繼承,擁有惟一的對象實例。設計模式
/*Singleton.java*/ public class Singleton { private static Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getInstance() { return singleton; } } /*Main.java*/ public class Main { public static void main(String[] args) { System.out.println("Start."); Singleton obj1 = Singleton.getInstance(); Singleton obj2 = Singleton.getInstance(); System.out.println("End."); } }
須要注意的是,靜態方法須要添加互斥數組
(生活場景:姚明去NBA打球時不會英語,須要翻譯來與教練、球員溝通)
(使用場景:在雙方都不太容易修改的時候,可使用。應用於但願複用一些現存的類,但接口不兼容的狀況)工具
(生活場景:售票員依次對車上全部人售票)
(使用場景:須要對彙集有多種方式遍歷時。【但.Net和JAVA中其實都已提供相關接口】)性能
/*Iterator.java*/ public interface Iterator { public abstract boolean hasNext(); public abstract Object next(); } /*BookShelfIterator.java*/ public class BookShelfIterator implements Iterator { private BookShelf bookShelf; private int index; public BookShelfIterator(BookShelf bookShelf) { this.bookShelf = bookShelf; this.index = 0; } public boolean hasNext() { if (index < bookShelf.getLength()) { return true; } else { return false; } } public Object next() { Book book = bookShelf.getBookAt(index); index++; return book; } }
爲何不直接使用BookShelfIterator,而須要繼承Iterator迭代器呢?由於不一樣的聚合對象有不一樣的高效的訪問方式,例如數組能夠直接返回下標,但對於鏈表、樹而言顯然須要另一種方式。this
(生活場景:簡歷的複印。若是須要三份簡歷須要實例化簡歷三次,這時也使用原型模式)
原型模式就是從一個對象再建立另一個可定製的對象,而且不須要知道任何建立的細節。等於不一樣從新初始化對象,而是動態得到對象運行時的狀態。大大提升了性能。spa
【ps:淺拷貝與深拷貝】 淺拷貝:若是字段是值類型(例如int,float),則逐位複製。若字段是引用類型,只複製引用但不復制引用的對象。原始對象與副本引用同一對象。 深拷貝則是同時複製引用對象。把引用對象的變量指向複製過的新對象。