搜尋
首頁Javajava教程Java設計模式中工廠模式的介紹(程式碼範例)

這篇文章帶給大家的內容是關於Java設計模式中工廠模式的介紹(程式碼範例)有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

前言

在上一篇我們學習了單例模式,介紹了單例模式所建立的幾種方法以及最優的方法。本篇則介紹設計模式中的工廠模式,主要分為簡單工廠模式、工廠方法與抽象工廠模式。

簡單工廠模式

簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法模式。簡單工廠模式是由一個工廠物件決定創建哪一種產品類別的實例。呼叫只需要告訴工廠類別所需的類型,工廠類別就會傳回需要的產品類別工廠的子類別。可以說是工廠模式中最簡單的一種。

打個比方,我們在電腦經常玩遊戲,我們只需要告訴電腦我們要玩什麼遊戲,電腦就會打開這個遊戲,我們並不需要關心遊戲是怎麼運作的。
我們可以在以下的程式碼中進行對應的說明。

我們首先創建一個遊戲總類接口,包含一個玩遊戲的方法; 然後再由各自的遊戲類繼承該類並實現該類的方法,最後在創建一個工程類根據不同的遊戲進行創建物件。
那麼實現的程式碼如下:

程式碼範例:

    private static final String LOL="LOL"; 
    private static final String DNF="DNF"; 
    
    public static void main(String[] args) {
        Game game= ComputerFactory.playGame(LOL);
        Game game2= ComputerFactory.playGame(DNF);
        game.play();
        game2.play();
    }
}

interface Game{
    void play();
}

class LOL implements Game{
    @Override
    public void play() {
        System.out.println("正在玩LOL...");
    }   
}

class DNF implements Game{
    @Override
    public void play() {
        System.out.println("正在玩DNF...");
    }   
}


class ComputerFactory{
    private static final String LOL="LOL"; 
    private static final String DNF="DNF"; 
     public static Game playGame(String game){
         if(LOL.equalsIgnoreCase(game)){
             return new LOL();
         }else if(DNF.equalsIgnoreCase(game)){
             return new DNF();
         }
         return null;
     }

輸出結果:

正在玩LOL...
正在玩DNF...

我們在使用簡單工廠模式進行實現該功能之後,會發現我們將遊戲類別的實例化放到了工廠類別中實現,隱藏了物件創建的細節,並且不需要知道是怎麼玩的,只需要知道調用該工廠類別就行了。而且方便切換,因為只需更改工廠類別傳遞的類型值就行了。
但是我們也發現一個問題,如果我們需要新增一個遊戲類,那麼需要新定義一個接口,然後還要在工廠類中添加一個判斷分支,如果少量的話還好,但是大量的話就比較麻煩了,並且這也違背了開放-封閉原則。

工廠方法模式

工廠方法模式是 Java 中最常用的設計模式之一,屬於建立型模式。定義一個創建對象的接口,讓其子類自行決定實例化哪一個工廠類,工廠模式使其創建過程延遲到子類進行。

在簡單工廠模式中,我們發現在添加子類別的時候,相應的也需要在工廠類別中添加一個判斷分支,是違背了開放-封閉原則的。而工廠方法模式就是主要解決這個問題的。

這裡還是用上述的玩遊戲範例,只不過這裡每個遊戲都是由各自的遊戲工廠類別實作。主要區別就是由一個 工廠類別變成了多個了,降低了耦合度。如果新增一個遊戲類,相應的也只需在新增一個工廠類而已, 並且完美的遵循了開放-封閉原則。

將上述程式碼變更之後,對應的程式碼實作如下:

程式碼範例:

    private static final String LOL="LOL"; 
    private static final String DNF="DNF"; 
    private static final String WOW="WOW"; 

    public static void main(String[] args) {

        Game game3=new LOLFactory().playGame(LOL);
        Game game4=new DNFFactory().playGame(DNF);
        Game game5=new WOWFactory().playGame(WOW);
        game3.play();
        game4.play();
        game5.play();       
    }
    
interface Game{
    void play();
}


class LOL implements Game{
    @Override
    public void play() {
        System.out.println("正在玩LOL...");
    }   
}

class DNF implements Game{
    @Override
    public void play() {
        System.out.println("正在玩DNF...");
    }   
}

class WOW  implements Game{
    @Override
    public void play() {
        System.out.println("正在玩WOW...");
    }   
}


interface ComputerFactory2{
    Game playGame(String game);
}

class LOLFactory implements ComputerFactory2{
    @Override
    public Game playGame(String game) {
        return new LOL();
    }
}

class DNFFactory implements ComputerFactory2{
    @Override
    public Game playGame(String game) {
        return new DNF();
    }
}

class WOWFactory implements ComputerFactory2{
    @Override
    public Game playGame(String game) {
        return new WOW();
    }
}

輸出結果:

正在玩LOL...
正在玩DNF...
正在玩WOW...

可以看到使用工廠方法模式之後,我們的程式碼更加清晰了,擴展性也變高了,如果想增加一個產品,只要擴展一個工廠類別就可以。但是隨之而來的是在系統中增加了複雜度,每增加一個產品時,都需要增加一個具體類別和物件實作工廠類別。
所以在是否使用該模式需注意。
使用此模式比較經典的使用案例是大名鼎鼎的hibernate框架在選擇資料庫方言這塊。但是如果直接簡單的new一個物件的話,則不必使用了,若使用反而會增加系統的複雜度。

抽象工廠模式

抽象工廠模式是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。這種類型的設計模式屬於創建型模式,它提供了一種創建物件的最佳方式。也就是提供一個創建一系列相關或相互依賴物件的接口,而無需指定它們具體的類別。

抽象工廠模式相比工廠方法模式來說更加複雜,也更難理解,但是更容易擴展。
抽象工廠模式就將同一類的產品子類歸為一類,讓他們繼承同一個抽象子類,然後把它們當作一組,然後再把多個組組成一個族。
打個比方,還是上述的玩遊戲,我們可以把LOLWOW當作PVP類型的遊戲,也可以把 DNFWOW當作PVE類型的遊戲。

那麼對應更改的程式碼如下:

程式碼範例:

#
    private static final String LOL="LOL"; 
    private static final String DNF="DNF"; 
    private static final String WOW="WOW"; 
    
    public static void main(String[] args) {

        ComputerFactory3 cf3=new PVPFactory();
        cf3.playGame().play();
        cf3.playGame2().play();
        ComputerFactory3 cf4=new PVEFactory();
        cf4.playGame().play();
        cf4.playGame2().play();         
    }       
}


interface Game{
    void play();
}


class LOL implements Game{
    @Override
    public void play() {
        System.out.println("正在玩LOL...");
    }   
}

class DNF implements Game{
    @Override
    public void play() {
        System.out.println("正在玩DNF...");
    }   
}

class WOW  implements Game{
    @Override
    public void play() {
        System.out.println("正在玩WOW...");
    }   
}


interface ComputerFactory3{
     Game playGame();
     Game playGame2();
}

class PVPFactory implements ComputerFactory3{

    @Override
    public Game playGame() {
        return new LOL();
    }

    @Override
    public Game playGame2() {
        return new WOW();
    }   
}

class PVEFactory implements ComputerFactory3{

    @Override
    public Game playGame() {
        return new DNF();
    }

    @Override
    public Game playGame2() {
        return new WOW();
    }
    
}

輸出結果:

##############################################
正在玩LOL...
正在玩WOW...
正在玩DNF...
正在玩WOW...

在抽象工厂模式中,可以在不需要知道产品是怎么样的,只需知道是哪个工厂类就行了。我们也可以根据子类的共同的特性而将它们设计在一起,组成一个相同类型组,可以很方便的直接调用。但是相对的,产品族比较难以扩展,增加一个产品,需要增加相应的接口和实现类。例如某个品牌的手机,有不同系列,每个系列有不同的型号,如果只是增加型号的话,比较容易,但是相对的,增加某个系列就比较麻烦了。
所以我们在使用抽象工厂模式,也需要相应的结合实际场景来使用。

相关推荐:

Java设计模式是什么?Java设计模式中单例模式的介绍

以上是Java設計模式中工廠模式的介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱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.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

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