請教兩種Singleton Pattern 實現方式的區別!
我這幾天看了一個採用JavaBean+JSP設計的網站,其中資料庫連線的JavaBean為DBConnection.java,還有一個用來進行記錄執行日誌的類:Debug.java,這兩個類都採用了單例模式,但是方式有不同,請教一下為什麼要這樣做呢?
DBConnection.java如下:
DeBug.java 如下:
DBConnection使用了abstract防止被例項化,而Debug使用final,並且設定私有建構函式,二者各自實現單例模式,但為什麼要用這兩種不同方式呢??請教各位!!!
DBConnection.java如下:
import java.sql.*; /** * 本類用於與資料庫建立接 */ public abstract class DBConnection{ private static Connection conn=null; /** * 與資料庫建立連線 * * 返回值-Connection物件 */ public static Connection getConnection(){ try{ if(conn == null){ Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/hospital","root",""); Debug.log("Connection created."); } else{ Statement stmt=conn.createStatement(); ResultSet rs=stmt.executeQuery("SELECT COUNT(*) FROM administrator"); if(rs==null||!rs.next()){ Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/hospital","root",""); Debug.log("Connection re-created."); } } } catch(Exception ex){ Debug.log(Debug.getExceptionMsg(ex)); } finally{ return conn; } } } <p class="indent"> |
DeBug.java 如下:
import java.io.*; import java.util.Date; import java.text.SimpleDateFormat; /** * 本類用於將網站執行時遇到的異常資訊記錄到檔案中 */ public final class Debug{ private static Debug instance=null; private static SimpleDateFormat dateFormat=null; private static FileOutputStream fos=null; private Debug(){ } /** * 初始化Debug物件 * * 引數: * path-日誌檔案儲存路徑 * * 返回值-Debug單例物件 */ static synchronized Debug init(String path){ String file=""; String fullPath=""; if(instance == null){ instance=new Debug(); dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); file="" + (new SimpleDateFormat("yyyy-MM-dd")) .format(new Date()) + ".log"; try{ fullPath=path + "\\" + file; fos=new FileOutputStream(fullPath,true); } catch(IOException ioe){ System.err.println("Cannot open file " + file + "," + fullPath); } } return instance; } /** * 將資訊記入日誌檔案 * * 引數: * msg-資訊 */ public static synchronized void log(String msg){ String s2=dateFormat.format(new Date()) + " " + msg + "\n"; if(instance != null) instance.writeFile(s2); else System.err.println(s2); } /** * 將資訊記入日誌檔案,供log(String msg)呼叫 */ private String writeFile(String msg){ if(fos == null){ return "Log file cannot be opened"; } try{ fos.write(msg.getBytes()); fos.flush(); } catch(IOException ex){ return ex.getMessage(); } return null; } /** * 生成格式化異常資訊 * * 引數: * e-異常 * * 返回值-格式化後的異常資訊 */ public static String getExceptionMsg(Exception e){ StackTraceElement ste=e.getStackTrace()[0]; String msg=ste.getClassName() + "." + ste.getMethodName() + "() Ln " + ste.getLineNumber() + ": " + e.getMessage(); return msg; } } |
DBConnection使用了abstract防止被例項化,而Debug使用final,並且設定私有建構函式,二者各自實現單例模式,但為什麼要用這兩種不同方式呢??請教各位!!!
相關文章
- 三種Singleton的實現方式
- Java Singleton的3種實現方式Java
- 實現AS3的Singleton的兩種方法S3
- Java中Singleton的三種實現方式解析Java
- Java中實現並行請求兩種方式Java並行
- 兩種Delphi實現Singleton模式方法 (轉)模式
- 實現觀察者模式(Observer Pattern)的2種方式模式Server
- 動態代理的兩種方式以及區別
- javascript兩種宣告函式方式的區別JavaScript函式
- POSTMAN HTTP請求的四種方式區別PostmanHTTP
- 請教關於spring 兩種組合載入方式的使用?Spring
- JAVA中實現單例(Singleton)模式的八種方式Java單例模式
- hibernate中建立session的兩種方式方式,區別在哪裡?Session
- Spring實現IOC容器的兩種實現方式Spring
- Javascript中兩種方式定義函式的區別JavaScript函式
- GET和POST兩種基本請求方法的區別
- C++用多種方式實現Singleton單例模式C++單例模式
- 請教sleep()與yield()的區別
- 兩種方式實現輪播圖
- 前端--實現隔行變色的兩種方式前端
- 前端框架路由實現的Hash和History兩種模式的區別前端框架路由模式
- 請教 Disruptor 同 Actor 模型的區別模型
- 請教strategy 和 bridge的區別
- 請教AbstractFactory 和 Factory method 的區別
- wpf兩種佔位符實現方式
- 兩種方式實現web html sliderWebHTMLIDE
- 兩種遞迴方式實現迴文字遞迴
- MyBatis中主鍵回填的兩種實現方式MyBatis
- Spring定時器的兩種實現方式Spring定時器
- JavaScript建立閉包的兩種方式的優劣與區別分析JavaScript
- ViewPager兩種方式實現無限輪播Viewpager
- SpringBoot實現熱部署兩種方式!Spring Boot熱部署
- 兩種方式實現橫向滾動條
- zuul實現Cors跨域的兩種方式(https)ZuulCORS跨域HTTP
- Spring宣告式事務的兩種實現方式Spring
- 關於多執行緒的兩種實現方式執行緒
- 兩種增量備份的區別!
- 三種連結方式的區別