設計模式學習筆記(一)【Singleton、Adapter、Iterator 、Prototype 】

今天上課的時候老師開始講23個設計模式,爲加深印象,特開一篇文章來作記錄。
其中參考《大話設計模式》以及上課的例子(java),後期會補充關於js的應用java

  • Singleton 保證一個類僅有一個實例。讓類自身負責保存它的惟一實例。

    (使用場景:繪圖程序中的工具箱,無需每次點擊按鈕都從新建立一個工具箱對象)
    單例模式與實用類(例如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.");
    }
    }

    須要注意的是,靜態方法須要添加互斥數組

  • Adapter 將一個類的接口轉換成客戶但願的另一個接口,使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做

    (生活場景:姚明去NBA打球時不會英語,須要翻譯來與教練、球員溝通)
    (使用場景:在雙方都不太容易修改的時候,可使用。應用於但願複用一些現存的類,但接口不兼容的狀況)工具

    clipboard.png

  • Iterator 提供一種方法順序訪問一個聚合對象中各個元素,又不暴露該對象的內部表示

    (生活場景:售票員依次對車上全部人售票)
    (使用場景:須要對彙集有多種方式遍歷時。【但.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

  • Prototype 用原型實例制定建立對象的種類,並經過拷貝這些原型來建立新對象

    (生活場景:簡歷的複印。若是須要三份簡歷須要實例化簡歷三次,這時也使用原型模式)
    原型模式就是從一個對象再建立另一個可定製的對象,而且不須要知道任何建立的細節。等於不一樣從新初始化對象,而是動態得到對象運行時的狀態。大大提升了性能。
    clipboard.pngspa

【ps:淺拷貝與深拷貝】
淺拷貝:若是字段是值類型(例如int,float),則逐位複製。若字段是引用類型,只複製引用但不復制引用的對象。原始對象與副本引用同一對象。
深拷貝則是同時複製引用對象。把引用對象的變量指向複製過的新對象。
相關文章
相關標籤/搜索