設計模式:工廠方式模式、抽象工廠模式

前言

在面向對象程序設計中,工廠通常是一個用來創建其他對象的對象。工廠是構造方法的抽象,用來實現不同的分配方案。

工廠方法模式

工廠方法模式(英語:Factory method pattern)是一種實現了“工廠”概念的面向對象設計模式。就像其他創建型模式一樣,它也是處理在不指定對象具體類型的情況下創建對象的問題。工廠方法模式的實質是“定義一個創建對象的接口,但讓實現這個接口的類來決定實例化哪個類。工廠方法讓類的實例化推遲到子類中進行。”

根據定義可以知道,工廠方法模式的實質是定義一個創建對象的接口,但讓實現這個接口的類來決定實例化哪個類。類的實例在子類中進行。
首先創建一個創建對象的接口ProgrammeFactory

public interface ProgrammeFactory {
    Video getVideo();
}

只有一個方法用於獲取各類語言的教學視頻,再定義兩個子類去實現它

// 獲取Java語言的教學視頻
public class JavaProgrammeFactory implements ProgrammeFactory {

    @Override
    public Video getVideo() {
        System.out.println("獲取Java視頻教程");
        return new JavaVideo();
    }

}

// 獲取Python語言的教學視頻
public class PythonProgrammeFactory implements ProgrammeFactory {

    @Override
    public Video getVideo() {
        System.out.println("獲取Python視頻教程");
        return new PythonVideo();
    }

}

測試代碼

public class FactoryMethodDemo {

    public static void main(String[] args) {
        ProgrammeFactory factory = new JavaProgrammeFactory();
        factory.getVideo();
        factory = new PythonProgrammeFactory();
        factory.getVideo();
    }
}

工廠方法模式適用場景:

  • 創建對象需要大量重複代碼
  • 客戶端(應用層)不依賴與產品類實例如何被創建、實現等細節
  • 一個類通過其子類來指定創建哪個對象

工廠方法模式優點:

  • 用戶只需關心所需要產品對應的工廠,無需關心創建的細節
  • 加入新產品符合開閉原則,提供可擴展性

工廠方法模式缺點:

  • 類的個數容易過多,增加複雜性
  • 增加了系統的抽象性和理解難度

完整代碼:工廠方法模式

抽象工廠模式

抽象工廠模式(英語:Abstract factory pattern)是一種軟件開發設計模式。抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨的工廠封裝起來。在正常使用中,客戶端程序需要創建抽象工廠的具體實現,然後使用抽象工廠作爲接口來創建這一主題的具體對象。客戶端程序不需要知道(或關心)它從這些內部的工廠方法中獲得對象的具體類型,因爲客戶端程序僅使用這些對象的通用接口。抽象工廠模式將一組對象的實現細節與他們的一般使用分離開來。

抽象工廠模式主要用來解決產品族的問題。比如工廠模式中提到的兩種語言,不止有教學視頻,還有文章等,如此一來,就可以分爲:Java視頻、Java文章、Python視頻、Python文章四種產品。其中Java視頻和Java文章屬於同一產品族,Python視頻和Python文章屬於同一產品族。而Java視頻和Python視頻屬於不同產品族的同一產品等級,Java文章和Python文章也是如此。這時便要用到抽象工廠模式

首先創建一個創建對象的接口ProgrammeFactory

public interface ProgrammaFactory {

    Video getVideo();

    Article getArticle();
}

有兩個方法用於獲取視頻教程和文章教程(同一產品族),再定義兩個子類去實現它

// 獲取Java產品族的工廠
public class JavaProgrammaFactory implements ProgrammaFactory {

    public Video getVideo() {
        System.out.println("獲取Java視頻教程");
        return new JavaVideo();
    }

    public Article getArticle() {
        System.out.println("獲取Java文章教程");
        return new JavaArticle();
    }
}

// 獲取Python產品族的工廠
public class PythonProgrammaFactory implements ProgrammaFactory {

    public Video getVideo() {
        System.out.println("獲取Python視頻教程");
        return new PythonVideo();
    }

    public Article getArticle() {
        System.out.println("獲取Python文章教程");
        return new PythonArticle();
    }
}

測試代碼

public class FactoryMethodDemo {

    public static void main(String[] args) {
        ProgrammaFactory factory = new JavaProgrammaFactory();
        factory.getVideo();
        factory.getArticle();

        factory = new PythonProgrammaFactory();
        factory.getVideo();
        factory.getArticle();
    }

}

抽象工廠模式適用場景:

  • 客戶端(應用層)不依賴產品類實例如何被創建、實現等細節
  • 強調一系列相關的產品對象(屬於同一產品族)一起使用創建對象需要大量重複的代碼
  • 提供一個產品類的庫,所有產品以同樣的接口出現,從而使客戶端不依賴與具體實現

抽象工廠模式優點:

  • 具體產品在應用層代碼隔離,無需關心創建細節
  • 將一個系列的產品族統一到一起創建

抽象工廠模式缺點:

  • 規定了所有可能被創建的產品集合,產品族中擴展新的產品等級困難,需要修改抽象工廠的接口
  • 增加了系統的抽象性和理解難度

完整代碼:抽象工廠模式

總結

工廠方法模式和抽象工廠模式都是用來創建對象的設計模式。調用者無需知道對象被創建的具體過程,對調用者來說工廠類就是一個黑盒。

工廠方法模式中,每個工廠只能生產一類產品,而抽象工廠模式中,每個工廠可以生產一系列產品。

發佈了55 篇原創文章 · 獲贊 107 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章