在閻宏博士的《JAVA與模式》一書中開頭是這樣描述簡單工廠模式的:簡單工廠模式是類的建立模式,又叫作靜態工廠方法(Static Factory Method)模式。簡單工廠模式是由一個工廠對象決定建立出哪種產品類的實例。java
那麼簡單工廠模式是在什麼場景下使用呢,下面就以本人的理解舉例說明:數據庫
就拿登陸功能來講,假如應用系統須要支持多種登陸方式如:口令認證、域認證(口令認證一般是去數據庫中驗證用戶,而域認證則是須要到微軟的域中驗證用戶)。那麼天然的作法就是創建一個各類登陸方式都適用的接口,以下圖所示:
dom
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 { /** * 業務邏輯 */ } } }
簡單工廠模式的結構以下圖:spa
假如不使用簡單工廠模式則驗證登陸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
簡單工廠模式的優勢
模式的核心是工廠類。這個類含有必要的邏輯判斷,能夠決定在何時建立哪個登陸驗證類的實例,而調用者則能夠免除直接建立對象的責任。簡單工廠模式經過這種作法實現了對責任的分割,當系統引入新的登陸方式的時候無需修改調用者。
簡單工廠模式的缺點 這個工廠類集中了因此的建立邏輯,當有複雜的多層次等級結構時,全部的業務邏輯都在這個工廠類中實現。何時它不能工做了,整個系統都會受到影響。