Factory Design Pattern
當我們有一個具有多個子類的超類時,我們使用工廠設計模式,並且根據輸入類型,我們需要返回其中一個子類。此模式就是將類實例化的職責從客戶端程序轉移到工廠類。
讓我們首先學習如何在java中實現工廠設計模式,然後再研究工廠模式的優點。我們將在JDK中看到一些工廠設計模式的使用。請注意,此模式也稱為工廠方法設計模式。
Factory Design Pattern Super Class
工廠設計模式中的超類可以是接口、抽象類或普通java類。對於我們的工廠設計模式示例,我們有一個帶有覆蓋的toString()方法的抽象超類,用於測試。
<code>public abstract class Computer {
\tpublic abstract String getRAM();
\tpublic abstract String getHDD();
\tpublic abstract String getCPU();
\t@Override
\tpublic String toString() {
\t\treturn "RAM= " + this.getRAM() + ", HDD=" + this.getHDD() + ", CPU=" + this.getCPU();
\t}
}/<code>
Factory Design Pattern Sub Classes
假設我們有兩個子類PC和server。
<code>public class PC extends Computer {
\tprivate String ram;
\tprivate String hdd;
\tprivate String cpu;
\t
\tpublic PC(String ram, String hdd, String cpu){
\t\tthis.ram=ram;
\t\tthis.hdd=hdd;
\t\tthis.cpu=cpu;
\t}
\t@Override
\tpublic String getRAM() {
\t\treturn this.ram;
\t}
\t@Override
\tpublic String getHDD() {
\t\treturn this.hdd;
\t}
\t@Override
\tpublic String getCPU() {
\t\treturn this.cpu;
\t}
}
public class Server extends Computer {
\tprivate String ram;
\tprivate String hdd;
\tprivate String cpu;
\t
\tpublic Server(String ram, String hdd, String cpu){
\t\tthis.ram=ram;
\t\tthis.hdd=hdd;
\t\tthis.cpu=cpu;
\t}
\t@Override
\tpublic String getRAM() {
\t\treturn this.ram;
\t}
\t@Override
\tpublic String getHDD() {
\t\treturn this.hdd;
\t}
\t@Override
\tpublic String getCPU() {
\t\treturn this.cpu;
\t}
}/<code>
注意,這兩個類都擴展了Computer超類。
Factory Class
現在我們已經準備好了超類和子類,我們可以編寫工廠類了。下面是基本的實現。
<code>public class ComputerFactory {
\tpublic static Computer getComputer(String type, String ram, String hdd, String cpu){
\t\tif("PC".equalsIgnoreCase(type)) return new PC(ram, hdd, cpu);
\t\telse if("Server".equalsIgnoreCase(type)) return new Server(ram, hdd, cpu);
\t\t
\t\treturn null;
\t}
}/<code>
工廠設計模式方法的一些要點:
1、工廠類可以是單例的,返回子類的方法可以是靜態的。
2、根據輸入的參數返回不同的子類對象。
下面我們寫一些測試代碼。
<code>public class TestFactory {
\tpublic static void main(String[] args) {
\t\tComputer pc = ComputerFactory.getComputer("pc","2 GB","500 GB","2.4 GHz");
\t\tComputer server = ComputerFactory.getComputer("server","16 GB","1 TB","2.9 GHz");
\t\tSystem.out.println("Factory PC Config::"+pc);
\t\tSystem.out.println("Factory Server Config::"+server);
\t}
}/<code>
調試輸出內容如下。
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
工廠模式的優點:
1、工廠設計模式提供了接口代碼而不是實現代碼的方法。
2、工廠模式從客戶端代碼中移除實際實現類的實例化。工廠模式使我們的代碼更健壯、耦合更少且易於擴展。例如,我們可以很容易地改變PC類的實現,因為客戶端程序不知道這一點。
3、工廠模式通過繼承在實例實現和客戶類之間提供抽象。
工廠模式在jdk中的應用
1、java.util.Calendar、ResourceBundle和NumberFormat的getInstance()方法使用工廠模式。
2、valueOf()方法在包裝類,如布爾,整數類型等。
閱讀更多 東方洛雷 的文章