搜尋
首頁JavaJava基礎java的三種工廠模式是什麼?

java的三種工廠模式是什麼?

Nov 02, 2020 pm 02:23 PM
java工廠模式

java的三種工廠模式:1、簡單工廠模式,提供一個創建物件實例的功能,而無須關心其具體實現;2、工廠方法模式;3、抽象工廠模式,提供一個創建一系列相關或相互依賴物件的接口,無須指定它們特定的類別。

java的三種工廠模式是什麼?

(推薦教學:java入門教學

一、簡單工廠模式

簡單工廠的定義:提供一個建立物件實例的功能,而無須關心其具體實作。被建立實例的類型可以是介面、抽象類,也可以是具體的類別

實作汽車介面

public interface Car {
    String getName();
}

#賓士類別

public class Benz implements Car {
    @Override
    public String getName() {
        return "Benz";
    }
}

BMW類別

public class BMW implements Car {
    @Override
    public String getName() {
        return "BMW";
    }
}

#簡單工廠,既能生產寶馬又能生產賓士

public class SimpleFactory {
    public Car getCar(String name){
        if (name.equals("BMW")){
            return new BMW();
        }else if (name.equals("benz")){
            return new Benz();
        }else {
            System.out.println("不好意思,这个品牌的汽车生产不了");
            return null;
        }
    }
}

#測試類別

public class SimpleFactoryTest {
    public static void main(String[] args){
        SimpleFactory simpleFactory = new SimpleFactory();
        Car car = simpleFactory.getCar("BMW");
        System.out.println(car.getName());
    }
}

測試結果

BMW

根據簡單工廠的定義,使用者只要產品而不在乎產品如何生產,看起來好像很完美的樣子。但大家想想,這個世界存在著什麼都生產的工廠嗎?

顯然是不存在的,每個汽車品牌都有自己的生產工廠,都有自己生產技術。映射到spring框架中,我們有很多很多種的bean需要生產,如果只依靠一個簡單工廠來實現,那麼我們得在工廠類中嵌套多少個if..else if啊?

而且我們在程式碼中生產一輛汽車只是new一下就出來了,但實際操作中卻不知道需要進行多少操作,加載、註冊等操作都將體現在工廠類中,那麼這個類就會變得紊亂,管理起來也很不方便,所以說每個品牌應該要有自己的生產類。

因為專一,所以專業嘛,這時候工廠方法就出現了。

二、工廠方法模式

工廠介面

#
//定义一个工厂接口,功能就是生产汽车
public interface Factory {
    Car getCar();
}

賓士工廠##

public class BenzFactory implements Factory {
    @Override
    public Car getCar() {
        return new Benz();
    }
}

BMW工廠

public class BMWFactory implements Factory{
    @Override
    public Car getCar() {
        return new BMW();
    }
}

測試類別

public class FactoryTest {
   public static void main(String[] args){
       Factory bmwFactory = new BMWFactory();
       System.out.println(bmwFactory.getCar().getName());
       Factory benzFactory = new BenzFactory();
       System.out.println(benzFactory.getCar().getName());
   }
}

測試結果

BMW
Benz
根據上述程式碼可以看出,不同品牌的汽車是由不同的工廠生產的,似乎又是很完美的。但大家看一下測試類,當一個人想要去買一輛寶馬汽車的時候(假設沒有銷售商),那麼他就要去找寶馬工廠給他生產一輛,過幾天又想買一輛奔馳汽車的時候,又得跑到賓士工廠請人生產,無疑增加了使用者的操作複雜性。所以有沒有一種方便使用者操作的方法呢?這時候抽象工廠模式就出現了。

三、抽象工廠模式

 抽象工廠

public abstract class AbstractFactory {

     protected abstract Car getCar();
     
     //这段代码就是动态配置的功能
     //固定模式的委派
     public Car getCar(String name){
        if("BMW".equalsIgnoreCase(name)){
            return new BmwFactory().getCar();
        }else if("Benz".equalsIgnoreCase(name)){
            return new BenzFactory().getCar();
        }else if("Audi".equalsIgnoreCase(name)){
            return new AudiFactory().getCar();
        }else{
            System.out.println("这个产品产不出来");
            return null;
        }
    }
}

預設工廠

public class DefaultFactory extends AbstractFactory {

    private AudiFactory defaultFactory = new AudiFactory();
    
    public Car getCar() {
        return defaultFactory.getCar();
    }

}

BMW工廠

public class BMWFactory extends AbstractFactory {
    @Override
    public Car getCar() {
        return new BMW();
    }
}

#賓士工廠

public class BenzFactory extends AbstractFactory {
    @Override    public Car getCar() {
            return new Benz();
    }
}

 測試類別


public class AbstractFactoryTest {
    public static void main(String[] args) {        
        DefaultFactory factory = new DefaultFactory();        
        System.out.println(factory.getCar("Benz").getName());            
    }
}

測試結果

Benz
根據上述程式碼可以看出,使用者需要一輛汽車,只需要去找預設的工廠提出自己的需求(傳入參數),便能得到自己想要產品,而不用根據產品去尋找不同的生產工廠,方便使用者操作。

註:對於設計模式,有些人嗤之以鼻,有些人敬若神明,但我是認可的。

按我粗淺的理解,設計模式的經典之處,就在於解決了編寫程式碼的人和呼叫程式碼的人雙方的痛楚,不同的設計模式也只適用於不同的場景。至於用或不用,如何使用,那就需要各位看官著重考慮了。

但為了使用而使用是不應該的,細微之處,只有留給大家慢慢品味了。

更多程式相關知識,請造訪:

程式設計課程! !

以上是java的三種工廠模式是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Java中有哪些不同的垃圾收集算法(串行,並行,CMS,G1,ZGC)?Java中有哪些不同的垃圾收集算法(串行,並行,CMS,G1,ZGC)?Mar 14, 2025 pm 05:06 PM

本文討論了各種Java垃圾收集算法(串行,並行,CMS,G1,ZGC),它們的性能影響和適合大量堆的應用。

什麼是Java虛擬機(JVM),它在內部如何工作?什麼是Java虛擬機(JVM),它在內部如何工作?Mar 14, 2025 pm 05:05 PM

本文討論了Java虛擬機(JVM),詳細介紹了其在不同平台運行Java程序中的作用。它說明了JVM的內部流程,密鑰組件,內存管理,垃圾收集和性能Optimizatio

如何使用Java的Nashorn Engine用JavaScript腳本?如何使用Java的Nashorn Engine用JavaScript腳本?Mar 14, 2025 pm 05:00 PM

Java的Nashorn Engine可以在Java應用程序中啟用JavaScript腳本。關鍵步驟包括設置Nashorn,管理腳本和優化性能。主要問題涉及安全性,內存管理和未來兼容性

如何使用Java的Try-with-Resources語句進行自動資源管理?如何使用Java的Try-with-Resources語句進行自動資源管理?Mar 14, 2025 pm 04:59 PM

Java的Try-with-Resources通過自動關閉文件流或數據庫連接等資源來簡化資源管理,從而提高代碼可讀性和可維護性。

如何使用Java的枚舉來表示固定的值集?如何使用Java的枚舉來表示固定的值集?Mar 14, 2025 pm 04:57 PM

Java枚舉代表固定的值集,通過自定義方法和構造函數提供類型安全性,可讀性和其他功能。它們增強了代碼組織,可用於開關語句中以進行有效的價值處理。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。