網(wǎng)站建設(shè)需要服務(wù)器支持 嗎seo發(fā)貼軟件
1.請(qǐng)列舉出在 JDK 中幾個(gè)常用的設(shè)計(jì)模式?
單例模式(Singleton pattern)用于 Runtime,Calendar 和其他的一些類中。工廠模式(Factory pattern)被用于各種不可變的類如 Boolean,像 Boolean.valueOf,觀察者模式(Observer pattern)被用于 Swing 和很多的事件監(jiān)聽中。裝飾器設(shè)計(jì)模式(Decorator design pattern)被用于多個(gè) Java IO 類中。
2.什么是設(shè)計(jì)模式?你是否在你的代碼里面使用過任何設(shè)計(jì)模式?
設(shè)計(jì)模式是世界上各種各樣程序員用來解決特定設(shè)計(jì)問題的嘗試和測試的方法。設(shè)計(jì)模式是代碼可用性的延伸
3.Java 中什么叫單例設(shè)計(jì)模式?請(qǐng)用 Java 寫出線程安全的單例模式
單例模式重點(diǎn)在于在整個(gè)系統(tǒng)上共享一些創(chuàng)建時(shí)較耗資源的對(duì)象。整個(gè)應(yīng)用中只維護(hù)一個(gè)特定類實(shí)例,它被所有組件共同使用。Java.lang.Runtime 是單例模式的經(jīng)典例子。從 Java5 開始你可以使用枚舉(enum)來實(shí)現(xiàn)線程安全的單例。
4.在 Java 中,什么叫觀察者設(shè)計(jì)模式(observer design pattern)?
觀察者模式是基于對(duì)象的狀態(tài)變化和觀察者的通訊,以便他們作出相應(yīng)的操作。簡單的例子就是一個(gè)天氣系統(tǒng),當(dāng)天氣變化時(shí)必須在展示給公眾的視圖中進(jìn)行反映。這個(gè)視圖對(duì)象是一個(gè)主體,而不同的視圖是觀察者。
5.使用工廠模式最主要的好處是什么?在哪里使用?
工廠模式的最大好處是增加了創(chuàng)建對(duì)象時(shí)的封裝層次。如果你使用工廠來創(chuàng)建對(duì)象,之后你可以使用更高級(jí)和更高性能的實(shí)現(xiàn)來替換原始的產(chǎn)品實(shí)現(xiàn)或類,這不需要在調(diào)用層做任何修改。
6.舉一個(gè)用 Java 實(shí)現(xiàn)的裝飾模式(decorator design pattern)?它是作用于對(duì)象層次還是類層次?
裝飾模式增加強(qiáng)了單個(gè)對(duì)象的能力。Java IO 到處都使用了裝飾模式,典型例子就是Buffered 系列類如 BufferedReader 和 BufferedWriter,它們?cè)鰪?qiáng)了 Reader 和 Writer 對(duì)象, 以實(shí)現(xiàn)提升性能的 Buffer 層次的讀取和寫入。
7.在 Java 中,為什么不允許從靜態(tài)方法中訪問非靜態(tài)變量?
Java 中不能從靜態(tài)上下文訪問非靜態(tài)數(shù)據(jù)只是因?yàn)榉庆o態(tài)變量是跟具體的對(duì)象實(shí)例關(guān)聯(lián)的,而靜態(tài)的卻沒有和任何實(shí)例關(guān)聯(lián)。
8.設(shè)計(jì)一個(gè) ATM 機(jī),請(qǐng)說出你的設(shè)計(jì)思路?
比如設(shè)計(jì)金融系統(tǒng)來說,必須知道它們應(yīng)該在任何情況下都能夠正常工作。不管是斷電還是其他情況,ATM 應(yīng)該保持正確的狀態(tài)(事務(wù)) , 想想加鎖(locking)、事務(wù)(transaction)、錯(cuò)誤條件(error condition)、邊界條件(boundary condition) 等等。盡管你不能想到具體的設(shè)計(jì),但如果你可以指出非功能性需求,提出一些問題,想到關(guān)于邊界條件,這些都會(huì)是很好的。
9.在 Java 中,什么時(shí)候用重載,什么時(shí)候用重寫?
如果你看到一個(gè)類的不同實(shí)現(xiàn)有著不同的方式來做同一件事,那么就應(yīng)該用重寫(overriding),而重載(overloading)是用不同的輸入做同一件事。在 Java 中,重載的方法簽名不同,而重寫并不是。
10.舉例說明什么情況下會(huì)更傾向于使用抽象類而不是接口?
接口和抽象類都遵循”面向接口而不是實(shí)現(xiàn)編碼”設(shè)計(jì)原則,它可以增加代碼的靈活性, 可以適應(yīng)不斷變化的需求。下面有幾個(gè)點(diǎn)可以幫助你回答這個(gè)問題:
在Java中,你只能繼承一個(gè)類,但可以實(shí)現(xiàn)多個(gè)接口。所以一旦你繼承了一個(gè)類,你就失去了繼承其他類的機(jī)會(huì)了。
接口通常被用來表示附屬描述或行為如:Runnable、Clonable、Serializable等等,因此當(dāng)你使用抽象類來表示行為時(shí),你的類就不能同時(shí)是Runnable和Clonable(注:這里的意思是指如果把Runnable等實(shí)現(xiàn)為抽象類的情況),因?yàn)樵贘ava中你不能繼承兩個(gè)類,但當(dāng)你使用接口時(shí),你的類就可以同時(shí)擁有多個(gè)不同的行為。
在一些對(duì)時(shí)間要求比較高的應(yīng)用中,傾向于使用抽象類,它會(huì)比接口稍快一點(diǎn)。
如果希望把一系列行為都規(guī)范在類繼承層次內(nèi),并且可以更好地在同一個(gè)地方進(jìn)行編碼,那么抽象類是一個(gè)更好的選擇。有時(shí),接口和抽象類可以一起使用,接口中定義函數(shù),而在抽象類中定義默認(rèn)的實(shí)現(xiàn)。