創建型模式:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式
結構型模式:適配器模式、裝飾器模式、代理模式、外觀模式、
橋接模式、組合模式、享元模式
行爲型模式:策略模式、模版方法模式、觀察者模式、迭代子模式、責任鏈模式、
命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、
解釋器模式
(併發型模式、線程池模式)
重點內容記錄:
創建型模式:
工廠方法模式 出現大量產品要創建,並且有共同的接口時
抽象工廠模式 增加功能只需增加實現類,無需改動原有代碼
單例模式 保證在一個JVM中,該對象只有一個實例存在
代碼如下:
package helloworld;
public class Singleton {
private static Singleton singleton=null;
private Singleton(){
}
public static Singleton getInstance(){
if(singleton==null){
synchronized(singleton){
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
}
建造者模式 將各種產品集中管理,用於創建複合對象
原型模式
關於clone
淺複製:將一個對象複製後,基本數據類型的變量都會重新創建,而引用類型,指向的還是原對象所指向的。
深複製:將一個對象複製後,不論是基本數據類型還有引用類型,都是重新創建的。簡單來說,就是深複製進行了完全徹底的複製,而淺複製不徹底。
對於比較複雜的對象,選擇使用java串行化來實現深複製較爲簡便。其中串行化也成爲“醃鹹菜”,並行化成爲“回鮮”。
實現代碼如下:
public Object deepClone() {
//將對象寫到流裏
ByteArrayOutoutStream bo=new ByteArrayOutputStream();
ObjectOutputStream oo=new ObjectOutputStream(bo);
oo.writeObject(this);
//從流裏讀出來
ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi=new ObjectInputStream(bi);
return(oi.readObject());
}
結構型模式:
適配器模式:
類的適配器模式:當希望將一個類轉換成滿足另一個新接口的類時,可以使用類的適配器模式,創建一個新類,繼承原有的類,實現新的接口即可。
對象的適配器模式:當希望將一個對象轉換成滿足另一個新接口的對象時,可以創建一個Wrapper類,持有原類的一個實例,在Wrapper類的方法中,調用實例的方法就行。
接口的適配器模式:當不希望實現一個接口中所有的方法時,可以創建一個抽象類Wrapper,實現所有方法,我們寫別的類的時候,繼承抽象類即可。
裝飾模式:
裝飾模式就是給一個對象增加一些新的功能,而且是動態的,要求裝飾對象和被裝飾對象實現同一個接口,裝飾對象持有被裝飾對象的實例。
代理模式:
多一個代理類出來,替原對象進行一些操作。如果已有的方法在使用的時候需要對原有的方法進行改進,就可採用一個代理類調用原有的方法,且對產生的結果進行控制。
外觀模式:
解決類與類之家的依賴關係,像spring一樣,可以將類和類之間的關係配置到配置文件中,而外觀模式就是將他們的關係放在一個Facade類中,降低了類類之間的耦合度,該模式中沒有涉及到接口。
橋接模式:
把事物和其具體實現分開,使他們可以各自獨立的變化。橋接的用意是:將抽象化與實現化解耦,使得二者可以獨立變化。
組合模式:
將多個對象組合在一起進行操作,常用於表示樹形結構中,例如二叉樹,數等。
享元模式:
主要目的是實現對象的共享,即共享池,當系統中對象多的時候可以減少內存的開銷,通常與工廠模式一起使用。例如數據庫連接共享username、password等
行爲型模式:
策略模式:
定義了一系列算法,並將每個算法封裝起來,使他們可以相互替換,且算法的變化不會影響到使用算法的客戶。策略模式的決定權在用戶。
模版方法模式:
一個抽象類中,有一個主方法,再定義1...n個方法,可以是抽象的,也可以是實際的方法,定義一個類,繼承該抽象類,重寫抽象方法,通過調用抽象類,實現對子類的調用。
觀察者模式:
當一個對象變化時,其它依賴該對象的對象都會收到通知,並且隨着變化!對象之間是一種一對多的關係
迭代子模式:
迭代器模式就是順序訪問聚集中的對象,一是需要遍歷的對象,即聚集對象,二是迭代器對象,用於對聚集對象進行遍歷訪問。
責任鏈模式:
有多個對象,每個對象持有對下一個對象的引用,這樣就會形成一條鏈,請求在這條鏈上傳遞,直到某一對象決定處理該請求。但是發出者並不清楚到底最終那個對象會處理該請求,所以,責任鏈模式可以實現,在隱瞞客戶端的情況下,對系統進行動態的調整。
命令模式:
命令模式的目的就是達到命令的發出者和執行者之間解耦,實現請求和執行分開。
備忘錄模式:
主要目的是保存一個對象的某個狀態,以便在適當的時候恢復對象,個人覺得叫備份模式更形象些,通俗的講下:假設有原始類A,A中有各種屬性,A可以決定需要備份的屬性,備忘錄類B是用來存儲A的一些內部狀態,類C呢,就是一個用來存儲備忘錄的,且只能存儲,不能修改等操作。
狀態模式:
核心思想就是:當對象的狀態改變時,同時改變其行爲,很好理解!就拿QQ來說,有幾種狀態,在線、隱身、忙碌等,每個狀態對應不同的操作,而且你的好友也能看到你的狀態,所以,狀態模式就兩點:1、可以通過改變狀態來獲得不同的行爲。2、你的好友能同時看到你的變化。
訪問者模式:
把數據結構和作用於結構上的操作解耦合,使得操作集合可相對自由地演化。優點是增加操作很容易,因爲增加操作意味着增加新的訪問者。
中介者模式:
中介者模式也是用來降低類類之間的耦合的,因爲如果類類之間有依賴關係的話,不利於功能的拓展和維護,因爲只要修改一個對象,其它關聯的對象都得進行修改。如果使用中介者模式,只需關心和Mediator類的關係,具體類類之間的關係及調度交給Mediator就行,這有點像spring容器的作用。
解釋器模式:
主要在編譯器中運用。