Java 面試系列:設(shè)計模式常見面試題匯總

1.說一下設(shè)計模式?你都知道哪些?

答:設(shè)計模式總共有 23 種,總體來說可以分為三大類:創(chuàng)建型模式( Creational Patterns )、結(jié)構(gòu)型模式( Structural Patterns )和行為型模式( Behavioral Patterns )。

分類 包含 關(guān)注點
創(chuàng)建型模式 工廠模式、抽象工廠模式、單例模式、建造者模式、原型模式 關(guān)注于對象的創(chuàng)建,同時隱藏創(chuàng)建邏輯
結(jié)構(gòu)型模式 適配器模式、過濾器模式、裝飾模式、享元模式、代理模式、外觀模式、組合模式、橋接模式 關(guān)注類和對象之間的組合
行為型模式 責任鏈模式、命令模式、中介者模式、觀察者模式、狀態(tài)模式、策略模式、模板模式、空對象模式、備忘錄模式、迭代器模式、解釋器模式、訪問者模式 關(guān)注對象之間的通信

下面會對常用的設(shè)計模式分別做詳細的說明。

2.什么是單例模式?

答:單例模式是一種常用的軟件設(shè)計模式,在應(yīng)用這個模式時,單例對象的類必須保證只有一個實例存在,整個系統(tǒng)只能使用一個對象實例。

優(yōu)點:不會頻繁地創(chuàng)建和銷毀對象,浪費系統(tǒng)資源。

使用場景:IO 、數(shù)據(jù)庫連接、Redis 連接等。

單例模式代碼實現(xiàn):

class Singleton {
    private static Singleton instance = new Singleton();
    public static Singleton getInstance() {
        return instance;
    }
}

單例模式調(diào)用代碼:

public class Lesson7_3 {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        System.out.println(singleton1 == singleton2); 
    }
}

程序的輸出結(jié)果:true

可以看出以上單例模式是在類加載的時候就創(chuàng)建了,這樣會影響程序的啟動速度,那如何實現(xiàn)單例模式的延遲加載?在使用時再創(chuàng)建?

單例延遲加載代碼:

// 單例模式-延遲加載版
class SingletonLazy {
    private static SingletonLazy instance;
    public static SingletonLazy getInstance() {
        if (instance == null) {
            instance = new SingletonLazy();
        }
        return instance;
    }
}

以上為非線程安全的,單例模式如何支持多線程?

使用 synchronized 來保證,單例模式的線程安全代碼:

class SingletonLazy {
    private static SingletonLazy instance;
    public static synchronized SingletonLazy getInstance() {
        if (instance == null) {
            instance = new SingletonLazy();
        }
        return instance;
    }
}

3.什么是簡單工廠模式?

答:簡單工廠模式又叫靜態(tài)工廠方法模式,就是建立一個工廠類,對實現(xiàn)了同一接口的一些類進行實例的創(chuàng)建。比如,一臺咖啡機就可以理解為一個工廠模式,你只需要按下想喝的咖啡品類的按鈕(摩卡或拿鐵),它就會給你生產(chǎn)一杯相應(yīng)的咖啡,你不需要管它內(nèi)部的具體實現(xiàn),只要告訴它你的需求即可。

優(yōu)點

  • 工廠類含有必要的判斷邏輯,可以決定在什么時候創(chuàng)建哪一個產(chǎn)品類的實例,客戶端可以免除直接創(chuàng)建產(chǎn)品對象的責任,而僅僅“消費”產(chǎn)品;簡單工廠模式通過這種做法實現(xiàn)了對責任的分割,它提供了專門的工廠類用于創(chuàng)建對象;
  • 客戶端無須知道所創(chuàng)建的具體產(chǎn)品類的類名,只需要知道具體產(chǎn)品類所對應(yīng)的參數(shù)即可,對于一些復(fù)雜的類名,通過簡單工廠模式可以減少使用者的記憶量;
  • 通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類,在一定程度上提高了系統(tǒng)的靈活性。

缺點

  • 不易拓展,一旦添加新的產(chǎn)品類型,就不得不修改工廠的創(chuàng)建邏輯;
  • 產(chǎn)品類型較多時,工廠的創(chuàng)建邏輯可能過于復(fù)雜,一旦出錯可能造成所有產(chǎn)品的創(chuàng)建失敗,不利于系統(tǒng)的維護。

簡單工廠示意圖如下:

1

簡單工廠代碼實現(xiàn)

class Factory {
    public static String createProduct(String product) {
        String result = null;
        switch (product) {
            case "Mocca":
                result = "摩卡";
                break;
            case "Latte":
                result = "拿鐵";
                break;
            default:
                result = "其他";
                break;
        }
        return result;
    }
}

4.什么是抽象工廠模式?

還有 79% 的精彩內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
支付 ¥9.99 繼續(xù)閱讀

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容