原文鏈接
前言
工廠設(shè)計模式(Factory Design Pattern)屬于創(chuàng)建模式之一票唆,工廠設(shè)計模式在JDK,Spring,Stuts被廣泛使用
當(dāng)一個類或者接口有多個子類署照,并且基于輸入返回特定的子類,此時會使用工廠設(shè)計模式。這種模式負(fù)責(zé)從客戶端到工廠類的實例化惩琉。
讓我們首先學(xué)習(xí)如何在java中實現(xiàn)工廠設(shè)計模式态罪,然后我們將研究工廠模式的優(yōu)勢,我們將在JDK中看到一些工廠設(shè)計模式的使用微宝。請注意疮胖,此模式也稱為工廠方法設(shè)計模式。
工廠設(shè)計模式: 超類
工廠設(shè)計模式中的超類可以是接口设易,抽象類或普通的java類逗柴。對于我們的工廠設(shè)計模式示例,我們使用帶有重寫的toString()
方法的抽象超類進(jìn)行測試顿肺。
package com.github.shellhub.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è)計模式: 子類
假設(shè)我們有兩個子類PC
和Server
戏溺,具有以下實現(xiàn)。
PC.java
package com.github.shellhub.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.java
package com.github.shellhub.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)在我們準(zhǔn)備好了超類和子類屠尊,我們可以編寫工廠類旷祸。以下是基本的實現(xiàn)。
package com.github.shellhub.factory;
import com.github.shellhub.model.Computer;
import com.github.shellhub.model.PC;
import com.github.shellhub.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;
}
}
使用
這是一個簡單的測試客戶端程序讼昆,它使用上面的工廠設(shè)計模式實現(xiàn)托享。
package com.github.shellhub;
import com.github.shellhub.factory.ComputerFactory;
import com.github.shellhub.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);
}
}
Output:
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è)計模式的優(yōu)點(diǎn)
- 工廠設(shè)計模式提供了接口而不是實現(xiàn)的代碼方法。
- 工廠模式從客戶端代碼中刪除實際實現(xiàn)類的實例化浸赫。工廠模式使我們的代碼更健壯闰围,耦合更少,易于擴(kuò)展既峡。例如羡榴,我們可以輕松更改PC類實現(xiàn),因為客戶端程序不知道這一點(diǎn)运敢。
- 工廠模式通過繼承提供實現(xiàn)和客戶端類之間的抽象校仑。
工廠設(shè)計模式在JDK中的應(yīng)用
-
java.util.Calendar
,ResourceBundle
和NumberFormat getInstanc()
方法使用Factory模式传惠。 - 包裝類中的
valueOf()
方法迄沫,如Boolean
,Integer
等卦方。