设计模式 工厂方法_工厂设计模式–一种有效的方法
設(shè)計模式 工廠方法
如您所知,“工廠方法模式”或俗稱“工廠設(shè)計模式”是“創(chuàng)意設(shè)計模式”類別下的一種設(shè)計模式。 模式背后的基本原理是,在運行時,我們根據(jù)傳遞的參數(shù)獲得類似類型的對象。 關(guān)于這種模式的文章很多,開發(fā)人員可以通過各種方式來實現(xiàn)它。 在本文中,我將向您展示如何創(chuàng)建一種更好且最有效的工廠設(shè)計模式設(shè)計方法。
技術(shù)性
正如我已經(jīng)告訴您的那樣,在工廠設(shè)計的情況下,我們將在運行時獲得一個類似類型的對象,這樣,對象的基礎(chǔ)實現(xiàn)將位于屏幕后面。 讓我們考慮一個簡單的方法。 讓我們考慮一個可以是Male或Female的Person對象。 在運行時,我們僅應(yīng)考慮人的行為,而不應(yīng)考慮性別。 作為傳統(tǒng)方法,我們創(chuàng)建一個Person接口,并創(chuàng)建兩個實現(xiàn)類,例如MalePerson和FemalePerson。 基于運行時性別數(shù)據(jù),我們傳遞到Factory類的Factory方法,在此我們確定性別類型是Male還是Female,因此我們創(chuàng)建特定類的實例并返回引用類型對象。 這種方法聽起來不錯,我們在許多開發(fā)活動中都采用了這種方法。 在細粒度的多線程應(yīng)用程序中,我們可以確保它是有效的方法嗎? 表現(xiàn)如何呢? 還有其他方法嗎? 是的,我們愿意。
讓我們考慮另一個實時示例。 考慮一個組織中的某個情況,該雇員可以擔任CEO,CTO,CFO,開發(fā)人員,測試工程師,人力資源,人員,安全性等。如果您想根據(jù)組織了解雇員的角色,您將怎么辦? 您將如何創(chuàng)建更好的工廠設(shè)計,以便我們可以輕松地找到角色并且不應(yīng)有性能損失? 您是否會通過提供多個if子句來采用相同的傳統(tǒng)方法? 您可以提出一個論點,我們應(yīng)該使用切換條件。 很好……讓我們看看傳統(tǒng)方法,然后讓我們測量時間。
讓我們以傳統(tǒng)方式采用工廠設(shè)計。
package com.ddlab.rnd.patterns; /*** @author Debadatta Mishra(PIKU)**/ public interface Roles {public String getRole(); }上面的接口用作一種類型,因為組織中可以有各種類型的角色。 它有一個稱為“ getRole()”的方法,用于指定員工角色的描述。
讓我們?yōu)榻M織中CEO,CTO和CFO的合適角色設(shè)計實現(xiàn)類。
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";} }現(xiàn)在,我們必須考慮從中動態(tài)創(chuàng)建對象的工廠。 讓我們看下面的代碼。
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;} }讓我們編寫一個簡單的測試工具類來驗證設(shè)計。
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");}}如果運行上述程序,則以下是我系統(tǒng)的輸出。
僅供參考,我的系統(tǒng)具有4 GB RAM和I5處理器。
Role ::: CEO is the supreme head of the company Time difference ::: 3477574 nano seconds上面的設(shè)計似乎是正確的,但是性能呢? 您可能會說這沒關(guān)系,因為它以納秒為單位。 當然,您的應(yīng)用程序是否很小并不重要,但是對于大型企業(yè)應(yīng)用程序而言,這確實很重要。 如果您是優(yōu)秀的程序員或開發(fā)人員,則不能忽略性能問題,尤其是在產(chǎn)品開發(fā)的情況下,它們可能是市場上的同類產(chǎn)品。
為了解決上述問題,讓我們嘗試另一種工廠設(shè)計方法,即工廠類可能有所更改。
讓我們看下面的代碼。
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那時間呢 讓我們在傳統(tǒng)方法和現(xiàn)代方法之間進行比較。
| 傳統(tǒng)方法 | 3477574納秒 |
| 現(xiàn)代方法(使用枚舉和映射) | 1049108納秒 |
您能考慮一下時差嗎,它僅比傳統(tǒng)方法快3倍。
那么哪個更好呢? 當然,使用枚舉的現(xiàn)代方法更好。 除了枚舉,我還使用Map來維護雇員類型及其對應(yīng)的枚舉的列表。 在這種情況下,就循環(huán)復(fù)雜性而言,無需使用if子句可能會影響我們的性能。 使用以上1049108納秒的方法總是更好。 您可以將ConcurrentMap用于多線程應(yīng)用程序。
結(jié)論
希望您喜歡我關(guān)于工廠設(shè)計模式的文章。 如果有任何澄清,您可以與我聯(lián)系debadatta.mishra@gmail.com 。
翻譯自: https://www.javacodegeeks.com/2013/06/factory-design-pattern-an-effective-approach.html
設(shè)計模式 工廠方法
總結(jié)
以上是生活随笔為你收集整理的设计模式 工厂方法_工厂设计模式–一种有效的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓加密手机怎么解除(安卓加密手机)
- 下一篇: 透视变换–鸟瞰图_单例设计模式–鸟瞰