- 工廠方法模式一種創(chuàng)建對(duì)象的模式,它被廣泛應(yīng)用在jdk中以及Spring和Struts框架中;
- 工廠方法模式基于”輸入”,應(yīng)用在超類和多個(gè)子類之間的情況,這種模式將創(chuàng)建對(duì)象的責(zé)任轉(zhuǎn)移到工廠類;
- 首先讓我們學(xué)習(xí)一下如何在Java中應(yīng)用工廠方法模式并且學(xué)習(xí)到工廠方法的優(yōu)點(diǎn),另外工廠方法模式也廣泛應(yīng)用在jdk中;
- 超類可以是接口、抽象類、父類,本例中將通過重寫 toString() 方法來解釋工廠方法模式;
實(shí)例
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(); } }
工廠設(shè)計(jì)模式子類
假設(shè)子類 PC 和 Server 實(shí)現(xiàn)了 Computer:
實(shí)例
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 也實(shí)現(xiàn)了 Computer:
實(shí)例
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; } }
工廠類
現(xiàn)在有了多個(gè)子類和超類,接下來可以創(chuàng)建工廠類了:
實(shí)例
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; } }
需要重點(diǎn)指出的是:
- 工廠類可以是單例的,getComputer 可以是靜態(tài)的;
- getComputer 是工廠類的方法,且基于相同的參數(shù)類型返回了不同的對(duì)象;
接下來是一個(gè)簡(jiǎn)單的測(cè)試客戶端程序,它使用上面的工廠設(shè)計(jì)模式實(shí)現(xiàn)。
實(shí)例
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
工廠設(shè)計(jì)模式的優(yōu)點(diǎn)
- 面向接口編程,體現(xiàn)了面向?qū)ο蟮乃枷耄?/li>
- 將創(chuàng)建對(duì)象的工作轉(zhuǎn)移到了工廠類;
JDK 中的工廠設(shè)計(jì)模式實(shí)例
- 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