《JAVA與模式》之簡單工廠模式

在閻宏博士的《JAVA與模式》一書中開頭是這樣描述簡單工廠模式的:簡單工廠模式是類的建立模式,又叫作靜態工廠方法(Static Factory Method)模式。簡單工廠模式是由一個工廠對象決定建立出哪種產品類的實例。java

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

  就拿登陸功能來講,假如應用系統須要支持多種登陸方式如:口令認證、域認證(口令認證一般是去數據庫中驗證用戶,而域認證則是須要到微軟的域中驗證用戶)。那麼天然的作法就是創建一個各類登陸方式都適用的接口,以下圖所示:
imagedom

public interface Login {
    //登陸驗證
    public boolean verify(String name , String password);
}
public class DomainLogin implements Login {

    @Override
    public boolean verify(String name, String password) {
        // TODO Auto-generated method stub
        /**
         * 業務邏輯
         */
        return true;
    }

}
public class PasswordLogin implements Login {

    @Override
    public boolean verify(String name, String password) {
        // TODO Auto-generated method stub
        /**
         * 業務邏輯
         */
        return true;
    }

}

咱們還須要一個工廠類LoginManager,根據調用者不一樣的要求,建立出不一樣的登陸對象並返回。而若是碰到不合法的要求,會返回一個Runtime異常。ide

public class LoginManager {
    public static Login factory(String type){
        if(type.equals("password")){
            
            return new PasswordLogin();
            
        }else if(type.equals("passcode")){
            
            return new DomainLogin();
            
        }else{
            /**
             * 這裏拋出一個自定義異常會更恰當
             */
            throw new RuntimeException("沒有找到登陸類型");
        }
    }
}

測試類:測試

public class Test {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String loginType = "password";
        String name = "name";
        String password = "password";
        Login login = LoginManager.factory(loginType);
        boolean bool = login.verify(name, password);
        if (bool) {
            /**
             * 業務邏輯
             */
        } else {
            /**
             * 業務邏輯
             */
        }
    }
}

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

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

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

public class Test {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        String loginType = "password";
        String name = "name";
        String password = "password";
        //處理口令認證
        if(loginType.equals("password")){
            PasswordLogin passwordLogin = new PasswordLogin();
            boolean bool = passwordLogin.verify(name, password);
            if (bool) {
                /**
                 * 業務邏輯
                 */
            } else {
                /**
                 * 業務邏輯
                 */
            }
        }
        //處理域認證
        else if(loginType.equals("passcode")){
            DomainLogin domainLogin = new DomainLogin();
            boolean bool = domainLogin.verify(name, password);
            if (bool) {
                /**
                 * 業務邏輯
                 */
            } else {
                /**
                 * 業務邏輯
                 */
            }    
        }else{
            /**
             * 業務邏輯
             */
        }
    }
}

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

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

簡單工廠模式的優勢
  模式的核心是工廠類。這個類含有必要的邏輯判斷,能夠決定在何時建立哪個登陸驗證類的實例,而調用者則能夠免除直接建立對象的責任。簡單工廠模式經過這種作法實現了對責任的分割,當系統引入新的登陸方式的時候無需修改調用者。

簡單工廠模式的缺點  這個工廠類集中了因此的建立邏輯,當有複雜的多層次等級結構時,全部的業務邏輯都在這個工廠類中實現。何時它不能工做了,整個系統都會受到影響。

相關文章
相關標籤/搜索