單例模式和Factory 方法模式

來源:互聯網
上載者:User

標籤:線程同步   核心   缺點   actor   需要   共用資源   序列   public   共用   

單例模式的定義

單例模式(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方法,則可以直接通過對象複製方式建立一個新對象,對象

 

複製是不用調用類的建構函式,因此即使是私人的建構函式,對象仍然可以被複製。

注意:

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

 

展,採用有上限的多例模式,我們可以在設計時決定在記憶體中有多少個執行個體,方便系統進行

 

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

 

 

Factory 方法模式的定義

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

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

instantiate.Factory Method lets a class defer instantiation to subclasses.(定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類。Factory 方法使一個類的執行個體化延遲到其子類。)

Factory 方法模式的優點

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

 

其次,Factory 方法模式的擴充性非常優秀。

 

最後,Factory 方法模式是典型的解耦架構。

 

Factory 方法模式的使用情境

 

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

 

其次,需要靈活的、可擴充的架構時,可以考慮採用Factory 方法模式。

 

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

 

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

 

 

 Factory 方法模式的擴充

 

 

 

 

 

 

 

 

 

1. 縮小為簡單原廠模式

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

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

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

2. 升級為多個工廠類

3. 替代單例模式

單例模式的核心要求就是在記憶體中只有一個對象,通過Factory 方法模式也可以只在記憶體中生產一個對象。

 

4. 延遲初始化

 

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

 

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

 

消極式載入的工廠類

 

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容

器中,以方便下次調用。

 

單例模式和Factory 方法模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.