面試中常問到的設計模式
什麼是設計模式?
設計模式是世界上各種各樣程序員用來解決特定設計問題的嘗試和測試的方法。設計模式是代碼可用性的延伸
單例模式
保證被創建一次,節省系統開銷
餓漢式:上來不管有沒有對象,都要直接創建一個新的對象。
懶漢式:首先判斷有沒有創建對象,如果創建對象了就使用原來創建的對象,沒有創建的話新創建一個對象。
1)單例模式重點在於在整個系統上共享一些創建時較耗資源的對象。整個應用中只維護一個特定類實例,它被所有組件共同使用。Java.lang.Runtime
是單例模式的經典例子。從 Java 5 開始你可以使用枚舉(enum) 來實現線程安全的單例。(據測試,使用枚舉是單例模式最完美的一中寫法)
觀察者模式
定義了對象之間的一對多的依賴,這樣一來,當一個對象改變時,它的所有的依賴者都會收到通知並自動更新。
1)觀察者模式是基於對象的狀態變化和觀察者的通訊,以便他們作出相應的操作。簡單的例子就是一個天氣系統,當天氣變化時必須在展示給公衆的視圖中進行反映。這個視圖對象是一個主體,而不同的視圖是觀察者。
2)馬士兵老師講的小孩子哭例子,幾個觀察者(爸爸、媽媽、小狗)觀察小孩子,小孩子一開始哭,不同觀察者響應的不同方式,爸爸給小孩子餵奶粉,媽媽抱小孩子,小狗汪汪叫。
工廠模式
解耦代碼。
1)工廠模式的最大好處是增加了創建對象時的封裝層次。如果你使用工廠來創建對象,之後你可以使用更高級和更高性能的實現來替換原始的產品實現或類,這不需要在調用層做任何修改。
2)下面是對普通工廠舉例說明:
1.創建公共接口
/**
* 公共的發送接口
*/
public interface Sender {
public void send();
}
2.創建兩個實現類
/**
* 通過QQ發送
*/
public class sendQQ implements Sender {
@Override
public void send() {
System.out.println("使用QQ開始發送消息...");
}
}
/**
1. 通過微信發送
*/
public class sendWeChat implements Sender {
@Override
public void send() {
System.out.println("使用微信開始發消息...");
}
}
- 創建一個工廠
/**
1. 發送信息工廠
*/
public class SendFactory {
public Sender produce(String type){
if("QQ".equals(type)){
return new sendQQ();
}else if ("WeChat".equals(type)){
return new sendWeChat();
}else{
System.out.println("輸入類型有誤!");
return null;
}
}
}
- 使用工廠測試
public class FactoryTest {
public static void main(String[] args) {
SendFactory sendFactory = new SendFactory();
Sender qq = sendFactory.produce("WeChat");
qq.send();
}
}
工廠模式分類
1)簡單工廠:用來生產同一等級結構中的任意產品,對於增加新的產品,無能爲力。
2)工廠方法:用來生產同一等級結構中的固定產品,支持增加任意產品。
3)抽象工廠:用來生產不同產品族的全部產品,對於增加新的產品,無能爲力;支持增加產品族
裝飾者模式
裝飾模式增加強了單個對象的能力。Java IO 到處都使用了裝飾模式,典型例子就是 Buffered 系列類如BufferedReader
和BufferedWriter
,它們增強了Reader
和Writer
對象,以實現提升性能的 Buffer 層次的讀取和寫入。
參考來源:https://zhuanlan.zhihu.com/p/94767927
未完待續···