- 工廠方法模式一種創建對象的模式,它被廣泛應用在jdk中以及Spring和Struts框架中;
- 工廠方法模式基于”輸入”,應用在超類和多個子類之間的情況,這種模式將創建對象的責任轉移到工廠類;
- 首先讓我們學習一下如何在Java中應用工廠方法模式并且學習到工廠方法的優點,另外工廠方法模式也廣泛應用在jdk中;
- 超類可以是接口、抽象類、父類,本例中將通過重寫 toString() 方法來解釋工廠方法模式;
實例
package com.journaldev.design.model; public abstract class Computer { public abstract String getRAM(); public abstract String getHDD(); public abstract String getCPU(); @Override public String toString(){ return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU(); } }
工廠設計模式子類
假設子類 PC 和 Server 實現了 Computer:
實例
package com.journaldev.design.model; public class PC extends Computer { private String ram; private String hdd; private String cpu; public PC(String ram, String hdd, String cpu){ this.ram=ram; this.hdd=hdd; this.cpu=cpu; } @Override public String getRAM() { return this.ram; } @Override public String getHDD() { return this.hdd; } @Override public String getCPU() { return this.cpu; } }
Server 也實現了 Computer:
實例
package com.journaldev.design.model; public class Server extends Computer { private String ram; private String hdd; private String cpu; public Server(String ram, String hdd, String cpu){ this.ram=ram; this.hdd=hdd; this.cpu=cpu; } @Override public String getRAM() { return this.ram; } @Override public String getHDD() { return this.hdd; } @Override public String getCPU() { return this.cpu; } }
工廠類
現在有了多個子類和超類,接下來可以創建工廠類了:
實例
package com.journaldev.design.factory; import com.journaldev.design.model.Computer; import com.journaldev.design.model.PC; import com.journaldev.design.model.Server; public class ComputerFactory { public static Computer getComputer(String type, String ram, String hdd, String cpu){ if("PC".equalsIgnoreCase(type)) return new PC(ram, hdd, cpu); else if("Server".equalsIgnoreCase(type)) return new Server(ram, hdd, cpu); return null; } }
需要重點指出的是:
- 工廠類可以是單例的,getComputer 可以是靜態的;
- getComputer 是工廠類的方法,且基于相同的參數類型返回了不同的對象;

接下來是一個簡單的測試客戶端程序,它使用上面的工廠設計模式實現。
實例
package com.journaldev.design.test; import com.journaldev.design.abstractfactory.PCFactory; import com.journaldev.design.abstractfactory.ServerFactory; import com.journaldev.design.factory.ComputerFactory; import com.journaldev.design.model.Computer; public class TestFactory { public static void main(String[] args) { Computer pc = ComputerFactory.getComputer("pc","2 GB","500 GB","2.4 GHz"); Computer server = ComputerFactory.getComputer("server","16 GB","1 TB","2.9 GHz"); System.out.println("Factory PC Config::"+pc); System.out.println("Factory Server Config::"+server); } }
輸出:
Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz
工廠設計模式的優點
- 面向接口編程,體現了面向對象的思想;
- 將創建對象的工作轉移到了工廠類;
JDK 中的工廠設計模式實例
- java.util.Calendar, ResourceBundle and NumberFormat getInstance() 使用了工廠方法模式;
- valueOf() 在包裝類中,如Boolean, Integer 也使用了工廠方法模式;
譯文:https://www.jianshu.com/p/5d52e9ce7358
原文:https://www.journaldev.com/1392/factory-design-pattern-in-java
站長資訊網