JAVA面試常見問題之設計模式篇


1、常見的設計模式

     單例模式、工廠模式、建造模式、觀察者模式、適配器模式、代理模式、裝飾模式.

參考:https://www.cnblogs.com/cr330326/p/5627658.html

2、設計模式的六大原則及其含義

  1. 單一職責原則:一個類只負責一個功能領域中的相應職責,或者可以定義為:就一個類而言,應該只有一個引起它變化的原因。主要作用實現代碼高內聚,低耦合。
  2. 開閉原則:一個軟件實體應當對擴展開放,對修改關閉。即軟件實體應盡量在不修改原有代碼的情況下進行擴展。
  3. 里氏替換原則:所有引用基類(父類)的地方必須能透明地使用其子類的對象。里氏替換原則是實現開閉原則的方式之一
  4. 依賴倒置原則:抽象不應該依賴於細節,細節應當依賴於抽象。換言之,要針對接口編程,而不是針對實現編程。
  5. 接口隔離原則:使用多個專門的接口,而不使用單一的總接口,即客戶端不應該依賴那些它不需要的接口。
  6. 迪米特法則:一個軟件實體應當盡可能少地與其他實體發生相互作用。

參考:https://www.cnblogs.com/dolphin0520/p/3919839.html

3、常見的單例模式以及各種實現方式的優缺點,哪一種最好,手寫常見的單利模式

常見模式及優缺點

  • 餓漢式:
    • 優點:不用加鎖可以確保對象的唯一性,線程安全。
    • 缺點:初始化對象會浪費不必要的資源,未實現延遲加載。
  • 懶漢式:
    • 優點:實現了延時加載。
    • 缺點:線程不安全,想實現線程安全,得加鎖(synchronized),這樣會浪費一些不必要的資源。
  • 雙重檢測鎖式(Double Check Lock--DCL):
    • 優點:資源利用率高,效率高。
    • 缺點:第一次加載稍慢,由於java處理器允許亂序執行,偶爾會失敗。
  • 靜態內部式:
    • 優點:第一次調用方法時才加載類,不僅保證線程安全還能保證對象的唯一,還延遲了單例的實例化
    • 缺點:

      推薦使用靜態內部式

public class Singleton4 {

    private Singleton4() {
    }

    public Singleton4 getInstance() {
        return SingletonHolder.SINGLETON;
    }

    private static class SingletonHolder {
        private static final Singleton4 SINGLETON = new Singleton4();
    }
}

 參考:https://blog.csdn.net/username987654/article/details/79067583

4、設計模式在實際場景的應用

   單例:連接數據庫,記錄日志

5、Spring中用到了哪些設計模式

  1.  工廠模式:spring中的BeanFactory就是簡單工廠模式的體現,根據傳入一個唯一的標識來獲得bean對象,但是否是在傳入參數后創建還是傳入參數前創建這個要根據具體情況來定。
  2. 代理模式:Spring的AOP就是代理模式的體現。
  3. 觀察者模式:常用的地方是Listener的實現,spring中ApplicationListener就是觀察者的體現。
  4. 策略模式:spring在實例化對象的時候使用到了。
  5. 工廠方法:Spring中的FactoryBean就是典型的工廠方法模式。

參考:https://www.cnblogs.com/hwaggLee/p/4510687.html

6、MyBatis中用到了哪些設計模式

  1. Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
  2. 工廠模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
  3. 單例模式,例如ErrorContext和LogFactory;
  4. 代理模式,Mybatis實現的核心,比如MapperProxy、ConnectionLogger,用的jdk的動態代理;還有executor.loader包使用了cglib或者javassist達到延遲加載的效果;
  5. 組合模式,例如SqlNode和各個子類ChooseSqlNode等;
  6. 模板方法模式,例如BaseExecutor和SimpleExecutor,還有BaseTypeHandler和所有的子類例如IntegerTypeHandler;
  7. 適配器模式,例如Log的Mybatis接口和它對jdbc、log4j等各種日志框架的適配實現;
  8. 裝飾者模式,例如Cache包中的cache.decorators子包中等各個裝飾者的實現;
  9. 迭代器模式,例如迭代器模式PropertyTokenizer;

參考:https://www.cnblogs.com/shuchen007/p/9193179.html

7、動態代理

cglib,jdk


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM