單例模式和工廠方法模式


單例模式的定義

單例模式(Singleton Pattern)是一個比較簡單的模式,其定義如下:

Ensure a class has only one instance, and provide a global point of access to it.(確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。)

 

單例模式通用代碼

 

public class Singleton {

 

     private static final Singleton singleton = new Singleton();        

 

     //限制產生多個對象

 

     private Singleton(){

 

     }

 

     //通過該方法獲得實例對象

 

     public static Singleton getSingleton(){

 

             return singleton;

 

     }  

 

     //類中其他方法,盡量是static

 

     public static void doSomething(){

 

HuDun Demo

 

     }

 

}

單例模式的優點

● 由於單例模式在內存中只有一個實例,減少了內存開支,特別是一個對象需要頻繁地

創建、銷毀時,而且創建或銷毀時性能又無法優化,單例模式的優勢就非常明顯。

● 由於單例模式只生成一個實例,所以減少了系統的性能開銷,當一個對象的產生需要

比較多的資源時,如讀取配置、產生其他依賴對象時,則可以通過在應用啟動時直接產生一

個單例對象,然后用永久駐留內存的方式來解決(在Java EE中采用單例模式時需要注意JVM

垃圾回收機制)。

● 單例模式可以避免對資源的多重占用。

● 單例模式可以在系統設置全局的訪問點,優化和共享資源訪問。

 單例模式的缺點

● 單例模式一般沒有接口,擴展很困難。

● 單例模式對測試是不利的。在並行開發環境中,如果單例模式沒有完成,是不能進行

測試的,沒有接口也不能使用mock的方式虛擬一個對象。

● 單例模式與單一職責原則有沖突。

 單例模式的使用場景

在一個系統中,要求一個類有且僅有一個對象,如果出現多個對象就會出現“不良反

”,可以采用單例模式,具體的場景如下:

● 要求生成唯一序列號的環境;

● 在整個項目中需要一個共享訪問點或共享數據,例如一個Web頁面上的計數器,可以

不用把每次刷新都記錄到數據庫中,使用單例模式保持計數器的值,並確保是線程安全的;

● 創建一個對象需要消耗的資源過多,如要訪問IO和數據庫等資源;

● 需要定義大量的靜態常量和靜態方法(如工具類)的環境,可以采用單例模式(當

然,也可以直接聲明為static的方式)。

 單例模式的注意事項

首先,在高並發情況下,請注意單例模式的線程同步問題。

 

其次,需要考慮對象的復制情況。在Java中,對象默認是不可以被復制的,若實現了

 

Cloneable接口,並實現了clone方法,則可以直接通過對象復制方式創建一個新對象,對象

 

復制是不用調用類的構造函數,因此即使是私有的構造函數,對象仍然可以被復制。

注意:

需要產生固定數量對象的模式就叫做有上限的多例模式,它是單例模式的一種擴

 

展,采用有上限的多例模式,我們可以在設計時決定在內存中有多少個實例,方便系統進行

 

擴展,修正單例可能存在的性能問題,提供系統的響應速度。

 

 

工廠方法模式的定義

工廠方法模式使用的頻率非常高,在我們日常的開發中總能見到它的身影。其定義為:

Define an interface for creating an object,but let subclasses decide which class to

instantiate.Factory Method lets a class defer instantiation to subclasses.(定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。)

工廠方法模式的優點

首先,良好的封裝性,代碼結構清晰。

 

其次,工廠方法模式的擴展性非常優秀。

 

最后,工廠方法模式是典型的解耦框架。

 

工廠方法模式的使用場景

 

首先,工廠方法模式是new一個對象的替代品,所以在所有需要生成對象的地方都可以使用。

 

其次,需要靈活的、可擴展的框架時,可以考慮采用工廠方法模式。

 

再次,工廠方法模式可以用在異構項目中。

 

最后,可以使用在測試驅動開發的框架下。

 

 

 工廠方法模式的擴展

 

 

 

 

 

 

 

 

 

1. 縮小為簡單工廠模式

簡單工廠模式(Simple Factory Pattern),也叫做

靜態工廠模式。在實際項目中,采用該方法的案例還是比較多的,其缺點是工廠類的擴展比

較困難,不符合開閉原則,但它仍然是一個非常實用的設計模式。

2. 升級為多個工廠類

3. 替代單例模式

單例模式的核心要求就是在內存中只有一個對象,通過工廠方法模式也可以只在內存中生產一個對象。

 

4. 延遲初始化

 

何為延遲初始化(Lazy initialization)?一個對象被消費完畢后,並不立刻釋放,工廠類

 

保持其初始狀態,等待再次被使用。延遲初始化是工廠方法模式的一個擴展應用。

 

延遲加載的工廠類

 

public class ProductFactory {

 

     private static final Map<String,Product> prMap = new HashMap();

 

     public static synchronized  Product createProduct(String type) throws Exception{

 

             Product product =null;             

 

             //如果Map中已經有這個對象

 

             if(prMap.containsKey(type)){

 

                    product = prMap.get(type);

 

             }else{

 

                    if(type.equals("Product1")){

 

                            product = new ConcreteProduct1();

 

                    }else{

 

                            product = new ConcreteProduct2();

 

HuDun Demo

 

                    }

 

                    //同時把對象放到緩存容器中

 

                    prMap.put(type,product);

 

             }

 

             return product;

 

     }

 

}

代碼還比較簡單,通過定義一個Map容器,容納所有產生的對象,如果在Map容器中已

經有的對象,則直接取出返回;如果沒有,則根據需要的類型產生一個對象並放入到Map容

器中,以方便下次調用。

 


免責聲明!

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



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