簡單工廠模式

簡單工廠模式是類的創建模式,又叫做靜態工廠方法(Static Factory Method)模式。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。

那麼簡單工廠模式是在什麼場景下使用呢,下面就以本人的理解舉例說明:

  就拿登錄功能來說,假如應用系統需要支持多種登錄方式如:口令認證、域認證(口令認證通常是去數據庫中驗證用戶,而域認證則是需要到微軟的域中驗證用戶)。那麼自然的做法就是建立一個各種登錄方式都適用的接口,如下圖所示:

 

上代碼:

  1. package com.bankht.factory;  
  2.   
  3. /** 
  4.  * @author: 特種兵—AK47  
  5.  * @創建時間:2012-6-18 下午02:20:00 
  6.  *  
  7.  * @類說明 :建立一個各種登錄方式都適用的接口 
  8.  */  
  9. public interface Login {  
  10.     public boolean verify(String name, String password);  
  11. }  


 

  1. package com.bankht.factory;  
  2.   
  3. /** 
  4.  * @author: 特種兵—AK47  
  5.  * @創建時間:2012-6-18 下午02:25:06 
  6.  *  
  7.  * @類說明 :域認證 
  8.  */  
  9. public class DomainLogin implements Login {  
  10.   
  11.     @Override  
  12.     public boolean verify(String name, String password) {  
  13.         // TODO Auto-generated method stub  
  14.         /** 
  15.          * 業務邏輯 
  16.          */  
  17.         return true;  
  18.     }  
  19.   
  20. }  


 

  1. package com.bankht.factory;  
  2.   
  3. /** 
  4.  * @author: 特種兵—AK47  
  5.  * @創建時間:2012-6-18 下午02:27:40 
  6.  *  
  7.  * @類說明 :口令認證 
  8.  */  
  9. public class PasswordLogin implements Login {  
  10.   
  11.     @Override  
  12.     public boolean verify(String name, String password) {  
  13.         // TODO Auto-generated method stub  
  14.         /** 
  15.          * 業務邏輯 
  16.          */  
  17.         return true;  
  18.     }  
  19.   
  20. }  


 

我們還需要一個工廠類LoginManager,根據調用者不同的要求,創建出不同的登錄對象並返回。而如果碰到不合法的要求,會返回一個Runtime異常。

  1. package com.bankht.factory;  
  2.   
  3. /** 
  4.  * @author: 特種兵—AK47  
  5.  * @創建時間:2012-6-18 下午02:28:02 
  6.  *  
  7.  * @類說明 :工廠類 
  8.  */  
  9. public class LoginManager {  
  10.     public Login factory(String type) {  
  11.         if (type.equals("password")) {  
  12.   
  13.             System.out.println("您從工廠裏拿的是:口令認證");  
  14.             return new PasswordLogin();  
  15.   
  16.         } else if (type.equals("passcode")) {  
  17.   
  18.             System.out.println("您從工廠裏拿的是:域認證");  
  19.             return new DomainLogin();  
  20.   
  21.         } else {  
  22.             /** 
  23.              * 這裏拋出一個自定義異常會更恰當 
  24.              */  
  25.             throw new RuntimeException("沒有找到登錄類型");  
  26.         }  
  27.     }  
  28. }  


做一下測試:

  1. package com.bankht.factory;  
  2.   
  3. import org.junit.Test;  
  4.   
  5. /** 
  6.  * @author: 特種兵—AK47  
  7.  * @創建時間:2012-6-18 下午02:31:41 
  8.  *  
  9.  * @類說明 :測試工廠類 
  10.  */  
  11. public class TestFactory {  
  12.   
  13.     @Test  
  14.     public void testFactory() {  
  15.         // TODO Auto-generated method stub  
  16.         String loginType = "password";  
  17.         String name = "name";  
  18.         String password = "password";  
  19.         Login login = new LoginManager().factory(loginType);  
  20.         boolean bool = login.verify(name, password);  
  21.         if (bool) {  
  22.             /** 
  23.              * 業務邏輯 
  24.              */  
  25.         } else {  
  26.             /** 
  27.              * 業務邏輯 
  28.              */  
  29.         }  
  30.     }  
  31. }  


測試結果:

  1. 您從工廠裏拿的是:口令認證  


 

簡單工廠模式的結構如下圖:

 

我們可以設想一下真實的場景,如果把上面的Test當做一個servlet的話,當客戶端發起登錄請求——>請求交給服務端的Servlet——>Servlet根據客戶端傳遞的loginType調用工廠類LoginManager的factory()方法——>factory()方法根據參數loginType創建相應的登錄驗證類(DomainLogin或PasswordLogin)並返回——>登錄驗證類調用方法verify()驗證用戶名密碼是否正確

假如不使用簡單工廠模式則驗證登錄Servlet代碼如下(假設Test爲一個Servlet,變量loginType、name、password表示從客戶端傳遞過來的參數):

  1. package com.bankht.factory;  
  2.   
  3. /** 
  4.  * @author: 特種兵—AK47 
  5.  * @創建時間:2012-6-19 下午02:26:45 
  6.  *  
  7.  * @類說明 : 
  8.  */  
  9. public class Test {  
  10.     public static void main(String[] args) {  
  11.         // TODO Auto-generated method stub  
  12.   
  13.         String loginType = "password";  
  14.         String name = "name";  
  15.         String password = "password";  
  16.         // 處理口令認證  
  17.         if (loginType.equals("password")) {  
  18.             PasswordLogin passwordLogin = new PasswordLogin();  
  19.             boolean bool = passwordLogin.verify(name, password);  
  20.             if (bool) {  
  21.                 /** 
  22.                  * 業務邏輯 
  23.                  */  
  24.             } else {  
  25.                 /** 
  26.                  * 業務邏輯 
  27.                  */  
  28.             }  
  29.         }  
  30.         // 處理域認證  
  31.         else if (loginType.equals("passcode")) {  
  32.             DomainLogin domainLogin = new DomainLogin();  
  33.             boolean bool = domainLogin.verify(name, password);  
  34.             if (bool) {  
  35.                 /** 
  36.                  * 業務邏輯 
  37.                  */  
  38.             } else {  
  39.                 /** 
  40.                  * 業務邏輯 
  41.                  */  
  42.             }  
  43.         } else {  
  44.             /** 
  45.              * 業務邏輯 
  46.              */  
  47.         }  
  48.     }  
  49. }  


 

上面的代碼會不會很蛋疼啊。。。呵呵

《JAVA與模式》一書中使用java.text.DataFormat類作爲簡單工廠模式的典型例子敘述。

簡單工廠模式的優點

  模式的核心是工廠類。這個類含有必要的邏輯判斷,可以決定在什麼時候創建哪一個登錄驗證類的實例,而調用者則可以免除直接創建對象的責任。簡單工廠模式通過這種做法實現了對責任的分割,當系統引入新的登錄方式的時候無需修改調用者。

簡單工廠模式的缺點

  這個工廠類集中了所有的創建邏輯,當有複雜的多層次等級結構時,所有的業務邏輯都在這個工廠類中實現。什麼時候它不能工作了,整個系統都會受到影響。

發佈了128 篇原創文章 · 獲贊 14 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章