標籤:java設計模式 單例模式
</pre>單例模式是一種常見的設計模式,一般有三種方式,單例模式具有如下特點:<p></p><p><span style="white-space:pre">1.在類的屬性中,自己初始化一個靜態私人的類執行個體<span style="white-space:pre"></span>2.將自己的構造方法寫成private的方式,拒絕其他類或者操作再次使用建構函式將單例類再次執行個體化<span style="white-space:pre"></span>3.向外界提供一個公開的方法來擷取自己的唯一單一實例</span></p><p><span style="white-space:pre"></span>用一句話來概括就是:單例模式類有且僅有一個自己初始化的執行個體,通過方法向外界提供該執行個體</p><p>那麼單例模式有什麼用途呢或者說單例模式都有哪些常見的呢?</p><p><span style="white-space:pre"></span>你比如說,我們電腦中的印表機管理器,電腦裡面只有一個該管理器的,但是我們的電腦可以同時串連上多個印表機,管理器的作用就是管理印表機工作情況,避免出現兩個印表機同時工作的時候,會出現列印衝突的現象,管理器主要就幹這個事的,我們電腦裡面這一類的管理器,記憶體池等等都是單例模式的一種表現,單例模式就是為了避免同時運行時產生衝突。</p><p>常見的單例模式有三種,這裡暫時先介紹兩種,因為第三種我還沒來得及研究呢!</p><p>1.餓漢單例模式</p><p></p><pre name="code" class="java">pubic class Demo(){private static Demo demo = new Demo();//建立private、static的本類的執行個體private Demo(){}//private私人的構造方法,拒絕初始化第二個執行個體public Demo getDemo(){//公用開放的擷取執行個體的方法return demo;}//其他方法和操作}
2.懶漢式單例模式
pubic class Demo(){private static Demo demo = null;private Demo(){}//private私人的構造方法,拒絕初始化第二個執行個體public Demo getDemo(){//公用開放的擷取執行個體的方法if(demo == null)demo = new Demo();return demo;}//其他方法和操作}
但是很顯然,上面的這個寫法是非安全執行緒的。
小知識:安全執行緒
安全執行緒就是我的這段代碼在多個線程中同時被運行了,多線程啟動並執行結果與單線程情況下運行出來的結果是不是一致的,如果不一致,那麼我們就可以說這是非安全執行緒的,反之就是個安全執行緒的,上面的這個代碼,很顯然,是非安全執行緒的,餓漢式寫法也是如此,非安全執行緒的。
換句話說,就是如果一段代碼的運行,對線程來說屬於原子操作或者在不同的進程之間來回切換的不會造成結果的二義性,那麼就是安全執行緒的,這時候我們不需要考慮同步啟動並執行情況了。
3.登記式單例模式
有待補充這種單例模式
下面就來一個執行個體吧!單例模式最常見的寫法我覺得應該就是jdbc擷取connection的時候了吧,下面就寫一個這幾天我在實習時過程中,看到同時給我些的這個東西,我也剛開始實習,這些我都還要繼續努力學習才能夠會呢!!
例子:
項目中,驅動的環境需要手動去設定和添加了,代碼如下:
public final class Server {/** * ConnectionFactory對象 */private ConnectionFactory factory = null;/** * 單例模式 */private static Server svr = new Server();/** * 構造方法 */private Server() {}/** * 擷取單例模式實體 * * @return Server */public static Server getInstance() {return svr;}/** * 擷取資料庫連接池工廠 * * @return ConnectionFactory */public synchronized ConnectionFactory getConnFactory() {if (factory == null) {try {MiniProperties ppt = new MiniProperties();ppt.load(Server.class.getResourceAsStream("/jdbc.properties"));<span style="white-space:pre"></span>//這裡需要注意路徑,改代碼詳細資料在下面一段代碼中factory = new PoolConnectionFactory("test", ppt);} catch (Exception e) {throw new RuntimeException("jdbc設定檔讀取失敗!");}}return factory;}public static void closeResource(Connection conn, Statement stmt,ResultSet rs) {if (rs != null) {try {rs.close();} catch (Exception e) {}}if (stmt != null) {try {stmt.close();} catch (Exception e) {}}if (conn != null) {try {conn.close();} catch (Exception e) {}}}}