Java程序員筆試寶典--常見設計模式

1. 寫一個單例類。

答:單例模式主要做用是保證在 Java 應用程序中,一個類只有一個實例存在。下面給出兩種不一樣形式的單例:java

第一種形式:餓漢式單例面試

public class Singleton {  
    private Singleton(){}  
    private static Singleton instance = new Singleton();  
    public static Singleton getInstance(){  
        return instance;  
    }  
}  
複製代碼

第二種形式:懶漢式單例算法

public class Singleton {  
    private static Singleton instance = null;  
    private Singleton() {}  
    public static synchronized Singleton getInstance(){  
        if (instance==null) instance=newSingleton();  
        return instance;  
    }  
}  
複製代碼

單例的特色:外界沒法經過構造器來建立對象,該類必須提供一個靜態方法向外界提供該類的惟一實例。編程

【補充】用 Java 進行服務器端編程時,使用單例模式的機會仍是不少的,服務器上的資源都是很寶貴的,對於那些無狀態的對象其實均可以單例化或者靜態化(在內存中僅有惟一拷貝),若是使用了 Spring 這樣的框架來進行對象託管,Spring 的 IoC 容器在默認狀況下對全部託管對象都是進行了單例化處理的。設計模式

2. 說說你所熟悉或據說過的設計模式以及你對設計模式的見解。

答:在 GoF 的《Design Patterns: Elements of Reusable Object-Oriented Software》中給出了三類(建立型[對類的實例化過程的抽象化]、結構型[描述如何將類或對象結合在一塊兒造成更大的結構]、行爲型[對在不一樣的對象之間劃分責任和算法的抽象化])共 23 種設計模式,包括:Abstract Factory(抽象工廠模式),Builder(建造者模式),Factory Method(工廠方法模式),Prototype(原始模型模式),Singleton(單例模式);Facade(門面模式),Adapter(適配器模式),Bridge(橋樑模式),Composite(合成模式),Decorator(裝飾模式),Flyweight(享元模式),Proxy(代理模式);Command(命令模式),Interpreter(解釋器模式),Visitor(訪問者模式),Iterator(迭代子模式),Mediator(調停者模式),Memento(備忘錄模式),Observer(觀察者模式),State(狀態模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibility(責任鏈模式)。安全

所謂設計模式,就是一套被反覆使用的代碼設計經驗的總結(情境中一個問題通過證明的一個解決方案)。使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設計模式令人們能夠更加簡單方便的複用成功的設計和體系結構。將已證明的技術表述成設計模式也會使新系統開發者更加容易理解其設計思路。服務器

3. 你在開發中都用到了那些設計模式?用在什麼場合?

答:面試被問到關於設計模式的知識時,能夠揀最經常使用的做答,例如:框架

1)工廠模式:工廠類能夠根據條件生成不一樣的子類實例,這些子類有一個公共的抽象父類而且實現了相同的方法,可是這些方法針對不一樣的數據進行了不一樣的操做(多態方法)。當獲得子類的實例後,開發人員能夠調用基類中的方法而沒必要考慮到底返回的是哪個子類的實例。函數

2)代理模式:給一個對象提供一個代理對象,並由代理對象控制原對象的引用。實際開發中,按照使用目的的不一樣,代理能夠分爲:遠程代理、虛擬代理、保護代理、Cache 代理、防火牆代理、同步化代理、智能引用代理。工具

3)適配器模式:把一個類的接口變換成客戶端所期待的另外一種接口,從而使本來因接口不匹配而沒法在一塊兒使用的類可以一塊兒工做。

4)模板方法模式:提供一個抽象類,將部分邏輯以具體方法或構造器的形式實現,而後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不一樣的子類能夠以不一樣的方式實現這些抽象方法(多態實現),從而實現不一樣的業務邏輯。

除此以外,還能夠講講上面提到的門面模式、橋樑模式、單例模式、裝潢模式(Collections 工具類裏面的 synchronizedXXX 方法把一個線程不安全的容器變成線程安全容器就是對裝潢模式的應用,而 Java IO 裏面的過濾流(有的翻譯成處理流)也是應用裝潢模式的經典例子)等,反正原則就是揀本身最熟悉的用得最多的做答,以避免言多必失。

4. 編程題: 寫一個Singleton出來

Singleton 模式主要做用是保證在 Java 應用程序中,一個類 Class 只有一個實例存在。
通常 Singleton 模式一般有幾種種形式:

第一種形式: 定義一個類,它的構造函數爲 private的,它有一個 static 的 private 的該類變量,在類初始化時實例話,經過一個 public 的 getInstance 方法獲取對它的引用,繼而調用其中的方法。

public class Singleton {
private Singleton(){}
   //在本身內部定義本身一個實例,是否是很奇怪?
   //注意這是private 只供內部調用
   private static Singleton instance = new Singleton();
   //這裏提供了一個供外部訪問本class的靜態方法,能夠直接訪問  
   public static Singleton getInstance() {
     return instance;   
   } 
} 
第二種形式: 
public class Singleton { 
  private static Singleton instance = null;
  public static synchronized Singleton getInstance() {
  //這個方法比上面有所改進,不用每次都進行生成對象,只是第一次     
  //使用時生成實例,提升了效率!
  if (instance==null)
    instance=new Singleton();
return instance;   } 
} 
複製代碼

其餘形式:

定義一個類,它的構造函數爲 private 的,全部方法爲 static 的。

通常認爲第一種形式要更加安全些

相關文章
相關標籤/搜索