本文翻譯自:https://www.journaldev.com/1392/factory-design-pattern-in-java
- 工廠方法模式一種創(chuàng)建對象的模式,它被廣泛應(yīng)用在jdk中以及Spring和Struts框架中;
- 工廠方法模式基于“輸入”花吟,應(yīng)用在超類和多個子類之間的情況懒震,這種模式將創(chuàng)建對象的責任轉(zhuǎn)移到工廠類趾诗;
- 首先讓我們學習一下如何在Java中應(yīng)用工廠方法模式并且學習到工廠方法的優(yōu)點句旱,另外工廠方法模式也廣泛應(yīng)用在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();
}
}
Factory Design Pattern Sub Classes
假設(shè)子類PC和Server實現(xiàn)了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也實現(xiàn)了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;
}
}
Factory Class
現(xiàn)在有了多個子類和超類伯襟,接下來可以創(chuàng)建工廠類了:
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可以是靜態(tài)的握童;
- getComputer是工廠類的方法姆怪,且基于相同的參數(shù)類型返回了不同的對象;
接下來是一個小case澡绩,用于測試工廠方法的效果:
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
Factory Design Pattern Advantages
- 面向接口編程片效,體現(xiàn)了面向?qū)ο蟮乃枷耄?/li>
- 將創(chuàng)建對象的工作轉(zhuǎn)移到了工廠類;
Factory Design Pattern Examples in JDK
- java.util.Calendar, ResourceBundle and NumberFormat getInstance() 使用了工廠方法模式英古;
- valueOf() 在包裝類中淀衣,如Boolean, Integer 也使用了工廠方法模式;