- 工廠方法模式一種創(chuàng)建對(duì)象的模式,它被廣泛應(yīng)用在jdk中以及Spring和Struts框架中;
- 工廠方法模式基于”輸入”,應(yīng)用在超類(lèi)和多個(gè)子類(lèi)之間的情況,這種模式將創(chuàng)建對(duì)象的責(zé)任轉(zhuǎn)移到工廠類(lèi);
- 首先讓我們學(xué)習(xí)一下如何在Java中應(yīng)用工廠方法模式并且學(xué)習(xí)到工廠方法的優(yōu)點(diǎn),另外工廠方法模式也廣泛應(yīng)用在jdk中;
- 超類(lèi)可以是接口、抽象類(lèi)、父類(lèi),本例中將通過(guò)重寫(xiě) toString() 方法來(lái)解釋工廠方法模式;
實(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ì)模式子類(lèi)
假設(shè)子類(lèi) 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; } }
工廠類(lèi)
現(xiàn)在有了多個(gè)子類(lèi)和超類(lèi),接下來(lái)可以創(chuàng)建工廠類(lèi)了:
實(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)指出的是:
- 工廠類(lèi)可以是單例的,getComputer 可以是靜態(tài)的;
- getComputer 是工廠類(lèi)的方法,且基于相同的參數(shù)類(lèi)型返回了不同的對(duì)象;

接下來(lái)是一個(gè)簡(jiǎn)單的測(cè)試客戶(hù)端程序,它使用上面的工廠設(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)移到了工廠類(lèi);
JDK 中的工廠設(shè)計(jì)模式實(shí)例
- java.util.Calendar, ResourceBundle and NumberFormat getInstance() 使用了工廠方法模式;
- valueOf() 在包裝類(lèi)中,如Boolean, Integer 也使用了工廠方法模式;
譯文:https://www.jianshu.com/p/5d52e9ce7358
原文:https://www.journaldev.com/1392/factory-design-pattern-in-java
站長(zhǎng)資訊網(wǎng)