程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java設計模式之Singleton模式

Java設計模式之Singleton模式

編輯:關於JAVA

Java Singleton 模式用來保證在運行的應用程序中,一個Class只是實例化一次,也就是只有一個相應的對象存在。在 web 程序中我們會用一個核心的分配功能的Servlet程序,在這裡我們就可以運用這種設計模式了。

  一般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; } 
  }

  例子:

 


 /** 
  * 數據庫連接管理類 

  */ 
  public class DBManager { 
  private static Logger logger = Logger.getLogger(DBManager.class);
  /** 
  * 本靜態變量用來存放本系統啟動時由Struts生成的連接池的數據源 
  */ 
  private static DataSource datasource; 
  /** 
  * 由於本類使用單態設計模式,因此不允許在使用中通過New進行實例化,那麼本類就要提供一個 此類的實例供外界使用,這就是供外界使用的實例 
  */ 
  private static [color=#FF0000]DBManager dbConManager = new DBManager();[/color]//類被加載時構建實例 
  private DBManager() { 
  } 
  /** 
  * 此靜態方法用來向類的靜態變量賦值,用來在系統中使用  

  * 
  * @param mydatasource 
  * 傳入的struts生成的數據源 
  */ 
  public void setDatasource(DataSource mydatasource) { 
  logger.info("設置數據源"); 
  if (datasource == null) { 
  datasource = mydatasource; 
  } 
  }

/** 
  * 由於本類使用單態模式,不允許其他的類使用New進行創建實例 因此在這裡提供一個共有的靜態方法來向外界提供自己的一個實例。  

  * 
  * @return 返回本類的唯一實例 
  */ 
  public static DBManager getInstance() { 
  logger.info("獲得數據庫連接管理類的實例"); 
  return dbConManager; 
  } 
  /** 
  * 此方法提供一個可用的數據庫連接,從連接池中取得可用連接  

  * 
  * @return 可用的數據庫連接 
  * @throws Java.lang.SQLException 
  * 有可能要拋出的SQL異常 
  */ 
  public Connection getConnection() throws SQLException {
  Connection conn = null; 
  try { 
  logger.info("從連接池中獲得空閒的數據庫連接"); 
  conn = datasource.getConnection(); 
  return conn; 
  } catch (SQLException ex) { 
  logger.error("DBManager.getConnection(獲取數據庫連接失敗):[SQLException]" 
  + ex.getMessage()); 
  throw ex; 
  } 
  } 
  /** 
  * 這是一個用來關閉所有的數據庫連接相關的打開對象的方法,這樣作的好處是不用在每一次調用了sql之後 要寫一大串的關閉操作。 

  * 
  * @param conn 
  * 將要關閉的數據庫連接 
  * @param st 
  * 將要關閉的數據庫操作對象 
  * @param pst 
  * 將要關閉的預處理數據庫操作對象 
  * @param cst 
  * 將要關閉的數據庫存儲過程調用對象 
  * @param rst 
  * 將要關閉的數據庫記錄集對象 
  * @throws Java.lang.Exception 
  * 有可能要拋出的異常 
  */ 
  public void closeAll(Connection conn, Statement st, PreparedStatement pst,
  CallableStatement cst, ResultSet rst) throws DBManagerException {
  try { 
  if (rst != null) { 
  rst.close(); 
  } 
  if (st != null) { 
  st.close(); 
  } 
  if (pst != null) { 
  pst.close(); 
  } 
  if (cst != null) { 
  cst.close(); 
  } 
  if (conn != null) { 
  conn.close(); 
  } 
  } catch (SQLException e) { 
  throw new DBManagerException("數據庫對象關閉出錯!"+e.getMessage(),e); 
  } 
  } 
  }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved