JDK常用設計模式整理

  1. 觀察者模式
    jdk中有提供接口Observer 和用於定義subject的類Observable

     subject.addObserver(new ObserveTest());
     subject.set(3);
     subject.setChanged();
     subject.notifyObservers(3);
    

    subject持有一個Vector(線程安全的list),用於存儲addObserver方法裏面添加的觀察者Observer,通知通過Observer的update方法進行更新

  2. 橋接模式
    主要關注橋 先有橋 然後橋兩邊可以獨立變化擴展
    比如jdk裏面的

    Set<String> names = Collections.newSetFromMap(
                new ConcurrentHashMap<String, Boolean>()
        );
    

    把set和map橋接起來,同時map和set都可以獨立擴展和變化

  3. 裝飾者模式Decorator
    每個Decorator均有一個指向Subject對象的引用,附加的功能被添加在這個Subject對象上,不改變原始的指向類。而Decorator對象本身也是一個Subject對象,因而它也能夠被其他的Decorator所修飾,提供組合的功能。

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in))
    while(true){
        System.out.println(br.readLine())
    }
    

    BufferedReader InputStreamReader 都繼承了抽象類Reader,然後BufferedReader類裏持有InputStreamReader對象的引用 兩個都是獨立的裝飾者 各自增強了被裝飾類的功能

  4. prototype 原型模式
    意圖:用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。
    主要解決:在運行期建立和刪除原型。
    應用實例: 1、細胞分裂。 2、JAVA 中的 Object clone() 方法。
    原型模式很少單獨出現,一般是和工廠方法模式一起出現,通過 clone 的方法創建一個對象,然後由工廠方法提供給調用者。原型模式已經與 Java 融爲渾然一體,大家可以隨手拿來使用。
    淺拷貝實現 Cloneable,重寫,深拷貝是通過實現 Serializable 讀取二進制流。

  5. builder建造者模式
    和工廠方法區別,兩者都是組裝對象,而建造者模式更關心零件的裝配順序。
    如jdk中的StringBuilder StringBuffer的append方法

  6. 工廠方法模式
    Calendar calendar = java.util.Calendar.getInstance();
    另外: 簡單工廠是指不用接口只有一個工廠,所有產品都在這個工廠類裏面進行創建,添加需要生產的商品就需要改動這個類; 工廠方法也就是工廠模式主要使用工廠接口和產品接口,具體工廠實現這個接口,需要添加的時候只需要增加一個實現工廠接口的具體工廠實現類,然後就可以了,抽象工廠主要是解決工廠方法模式一個工廠只能生產一類產品的缺陷,抽象工廠一個工廠可以生產一系列的產品,也就是產品族,比如手機工廠可以生產不同的手機。據此,spring的bean factory應該劃分屬於抽象工廠的設計模式

  7. 適配器模式
    泛型必須寫在返回值或者void前面

    <T> void test2(T a){
        System.out.println();
    }
    List<Integer> arrayList = java.util.Arrays.asList(new Integer[]{1,2,3});
    List<Integer> arrayList = java.util.Arrays.asList(1,2,3);
    

    可以看作把數組適配爲鏈表list

  8. 享元模式 Flyweight
    java.lang.Integer#valueOf(int) (also on Boolean, Byte, Character, Short, Long and BigDecimal)
    主要爲了減少創建對象的數量,減少內存佔用和提高內存
    享元模式嘗試重用現有的同類對象,如果未找到匹配的對象,則創建新對象。(可能和各種連接池和線程池相關)

  9. 策略模式
    封裝行爲或者算法,能在運行時動態改變類的行爲或算法。
    在有多種算法類似的情況下,使用if…elase會複雜和難以維護
    關鍵代碼:實現同一接口
    jdk中compare() java.util.Comparator#compare()

  10. 適配器模式
    一個適配允許通常因爲接口不兼容而不能在一起工作的類工作在一起,做法是將類自己的接口包裹在一個已存在的類中。
    裝飾器模式,原有的不能滿足現有的需求,對原有的進行增強。
    代理模式,同一個類而去調用另一個類的方法,不對這個方法進行直接操作。
    外觀模式,我們通過外觀的包裝,使應用程序只能看到外觀對象,而不會看到具體的細節對象,這樣無疑會降低應用程序的複雜度,並且提高了程序的可維護性。

ref

  1. https://www.ibm.com/developerworks/cn/java/l-jdkdp/part1/index.html
  2. https://www.ibm.com/developerworks/cn/java/l-jdkdp/part3/index.html
  3. https://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns-in-javas-core-libraries
  4. https://blog.csdn.net/zhang31jian/article/details/50538000
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章