設(shè)計(jì)模式: Java中的工廠設(shè)計(jì)模式

原文鏈接

https://github.com/shellhub/blog/issues/22

前言

工廠設(shè)計(jì)模式(Factory Design Pattern)屬于創(chuàng)建模式之一,工廠設(shè)計(jì)模式在JDK,Spring,Stuts被廣泛使用


factory-design-pattern

當(dāng)一個(gè)類或者接口有多個(gè)子類,并且基于輸入返回特定的子類,此時(shí)會使用工廠設(shè)計(jì)模式。這種模式負(fù)責(zé)從客戶端到工廠類的實(shí)例化。

讓我們首先學(xué)習(xí)如何在java中實(shí)現(xiàn)工廠設(shè)計(jì)模式,然后我們將研究工廠模式的優(yōu)勢,我們將在JDK中看到一些工廠設(shè)計(jì)模式的使用。請注意,此模式也稱為工廠方法設(shè)計(jì)模式。

工廠設(shè)計(jì)模式: 超類

工廠設(shè)計(jì)模式中的超類可以是接口,抽象類或普通的java類。對于我們的工廠設(shè)計(jì)模式示例,我們使用帶有重寫的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è)計(jì)模式: 子類

假設(shè)我們有兩個(gè)子類PCServer,具有以下實(shí)現(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)備好了超類和子類,我們可以編寫工廠類。以下是基本的實(shí)現(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;
    }
}

使用

這是一個(gè)簡單的測試客戶端程序,它使用上面的工廠設(shè)計(jì)模式實(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è)計(jì)模式的優(yōu)點(diǎn)

  • 工廠設(shè)計(jì)模式提供了接口而不是實(shí)現(xiàn)的代碼方法。
  • 工廠模式從客戶端代碼中刪除實(shí)際實(shí)現(xiàn)類的實(shí)例化。工廠模式使我們的代碼更健壯,耦合更少,易于擴(kuò)展。例如,我們可以輕松更改PC類實(shí)現(xiàn),因?yàn)榭蛻舳顺绦虿恢肋@一點(diǎn)。
  • 工廠模式通過繼承提供實(shí)現(xiàn)和客戶端類之間的抽象。

工廠設(shè)計(jì)模式在JDK中的應(yīng)用

  1. java.util.Calendar,ResourceBundleNumberFormat getInstanc()方法使用Factory模式。
  2. 包裝類中的valueOf()方法,如Boolean,Integer等。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 參考資料:菜鳥教程之設(shè)計(jì)模式 設(shè)計(jì)模式概述 設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐,通常被有經(jīng)驗(yàn)...
    Steven1997閱讀 1,281評論 1 12
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,853評論 18 399
  • 什么時(shí)候我可以真正的發(fā)自內(nèi)心的,微笑,什么時(shí)候我可以真的放松一下自己,什么時(shí)候我可以再像以前那樣天真的什么都不去想。
    兩寶的媽咪閱讀 72評論 0 0
  • 武淑貞 把美食做成花,不僅好看,而且好吃,這樣的美食不多見,今天我給大家介紹一下內(nèi)蒙的美食——燒麥的家常...
    春光明媚_f373閱讀 673評論 2 3
  • 買的時(shí)候的小側(cè)芽,如今已經(jīng)慢慢長大啦!
    卡蜜婭養(yǎng)肉ing閱讀 552評論 0 0

友情鏈接更多精彩內(nèi)容