工厂设计模式–一种有效的方法
如您所知,工廠方法模式或俗稱工廠設計模式是“創意設計模式”類別下的一種設計模式。 模式背后的基本原理是,在運行時,我們根據傳遞的參數獲得類似類型的對象。 關于這種模式有很多文章,開發人員可以通過各種方式來實現它。 在本文中,我將向您展示如何創建一種更好,最有效的工廠設計模式設計方法。
技術性
正如我已經告訴您的那樣,在工廠設計的情況下,我們將在運行時獲得一個類似類型的對象,這樣,對象的基礎實現將位于屏幕后面。 讓我們考慮一個簡單的方法。 讓我們考慮一個可以是Male或Female的Person對象。 在運行時,我們僅應考慮人的行為,而不應考慮性別。 作為傳統方法,我們創建一個Person接口,并創建兩個實現類,例如MalePerson和FemalePerson。 根據運行時性別數據,我們傳遞到Factory類的Factory方法,在其中確定性別類型是Male還是Female,因此我們創建特定類的實例并返回引用類型對象。 這種方法聽起來不錯,我們在許多開發活動中都采用了這種方法。 在細粒度的多線程應用程序中,我們可以確保它是有效的方法嗎? 表現如何呢? 還有其他方法嗎? 是的,我們愿意。
讓我們考慮另一個實時示例。 考慮一個組織中的一種情況,該雇員可以擔任CEO,CTO,CFO,開發人員,測試工程師,人力資源,人事,安全等。如果您想根據組織來了解員工的角色,您會怎么做? 您將如何創建更好的工廠設計,以便我們可以輕松地找到角色并且不應有性能損失? 您是否會通過提供多個if子句來采用相同的傳統方法? 您可以提出一個論點,我們應該使用切換條件。 很好……讓我們看看傳統方法,然后讓我們測量時間。
讓我們以傳統方式采用工廠設計。
package com.ddlab.rnd.patterns; /*** @author Debadatta Mishra(PIKU)**/ public interface Roles {public String getRole(); }上面的接口用作一種類型,因為組織中可以有各種類型的角色。 它具有一個稱為“ getRole()”的方法,用于指定員工角色的描述。
讓我們為組織中CEO,CTO和CFO的合適角色設計實現類。
package com.ddlab.rnd.patterns; /*** @author Debadatta Mishra(PIKU)**/ public class CEORoles implements Roles {public String getRole() {return "CEO is the supreme head of the company";} }package com.ddlab.rnd.patterns; /*** @author Debadatta Mishra(PIKU)**/ public class CFORoles implements Roles {@Overridepublic String getRole() {return "CFO is the finance head of a company";} }package com.ddlab.rnd.patterns; /*** @author Debadatta Mishra(PIKU)**/ public class CTORoles implements Roles {@Overridepublic String getRole() {return "CTO is the technology decision maker of a company";} }現在,我們必須考慮從中動態創建對象的工廠。 讓我們看下面的代碼。
package com.ddlab.rnd.patterns; /*** @author Debadatta Mishra(PIKU)**/ public abstract class EmployeeFactory {public static Roles getRole( String type ){Roles roles = null;if( type.equals("cfo"))roles = new CFORoles();else if( type.equals("cto"))roles = new CTORoles();else if( type.equals("ceo"))roles = new CEORoles();return roles;} }讓我們編寫一個簡單的測試工具類來驗證設計。
package com.ddlab.rnd.patterns; /*** @author Debadatta Mishra(PIKU)**/ public class TestTraditionalFactoryDesign {public static void main(String[] args) {String type = "ceo";long startTime = System.nanoTime();String role = EmployeeFactory.getRole(type).getRole();System.out.println("Role ::: "+role);long endTime = System.nanoTime();System.out.println("Time difference ::: "+(endTime-startTime)+" nano seconds");}}如果運行上述程序,則以下是我系統的輸出。
僅供參考,我的系統具有4 GB RAM和I5處理器。
Role ::: CEO is the supreme head of the company Time difference ::: 3477574 nano seconds上面的設計似乎是正確的,但是性能呢? 您可能會說沒關系,因為它以納秒為單位。 當然,您的應用程序是否很小并不重要,但是對于大型企業應用程序而言,這確實很重要。 如果您是優秀的程序員或開發人員,則不能忽略性能問題,尤其是在產品開發的情況下,它們可能是市場上的同類產品。
為了解決上述問題,讓我們嘗試另一種工廠設計方法,即工廠類可能有所更改。
讓我們看下面的代碼。
package com.ddlab.rnd.patterns; /*** @author Debadatta Mishra(PIKU)**/ public enum EmployeeType {CEO("CEO") {@Overridepublic Roles getRoles() {return new CEORoles();}},CTO("CTO"){@Overridepublic Roles getRoles() {return new CTORoles();}},CFO("CFO"){@Overridepublic Roles getRoles() {return new CFORoles();}};private EmployeeType( String type ){this.type = type;}private String type;public abstract Roles getRoles();public String getType() {return type;}@Overridepublic String toString() {return "TYPE CODE -> "+type;} }下面給出了測試線束等級。
package com.ddlab.rnd.patterns; import java.util.HashMap; import java.util.Map; /*** @author Debadatta Mishra(PIKU)**/ public class TestFactoryDesign {static Map<String,EmployeeType> typeMap = new HashMap<String,EmployeeType>();static{typeMap.put("cto", EmployeeType.CTO);typeMap.put("ceo", EmployeeType.CEO);typeMap.put("cfo", EmployeeType.CFO);}public static void main(String[] args){String empType = "ceo";try {long startTime = System.nanoTime();String whatIstheRole = typeMap.get(empType).getRoles().getRole();System.out.println("Role of the Employee :::"+whatIstheRole);long endTime = System.nanoTime();System.out.println("Time difference ::: "+(endTime-startTime)+" nano seconds");}catch (NullPointerException e) {System.out.println("No such Role is found");e.printStackTrace();}} }如果運行上面的代碼,您將獲得以下輸出。
Role ::: CEO is the supreme head of the company Time difference ::: 1049108 nano seconds那時間呢 讓我們在傳統方法和現代方法之間花費時間進行比較。
| 傳統方法 | 3477574納秒 |
| 現代方法(使用枚舉和映射) | 1049108納秒 |
您能考慮一下時差嗎,它僅比傳統方法快3倍。
那么哪個更好呢? 當然,使用枚舉的現代方法更好。 除了枚舉,我還使用Map來維護雇員類型及其對應的枚舉的列表。 在這種情況下,就循環復雜性而言,無需使用if子句可能會影響我們的性能。 最好使用上述1049108納秒的方法。 您可以將ConcurrentMap用于多線程應用程序。
結論
希望您喜歡我關于工廠設計模式的文章。 如果有任何澄清,您可以與我聯系debadatta.mishra@gmail.com 。
翻譯自: https://www.javacodegeeks.com/2013/06/factory-design-pattern-an-effective-approach.html
總結
以上是生活随笔為你收集整理的工厂设计模式–一种有效的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 路由器设置怎么不能输入密码路由器如何不输
- 下一篇: 单例设计模式–鸟瞰