前言
在面向對象程序設計中,工廠通常是一個用來創建其他對象的對象。工廠是構造方法的抽象,用來實現不同的分配方案。
工廠方法模式
工廠方法模式(英語: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();
}
}
抽象工廠模式適用場景:
- 客戶端(應用層)不依賴產品類實例如何被創建、實現等細節
- 強調一系列相關的產品對象(屬於同一產品族)一起使用創建對象需要大量重複的代碼
- 提供一個產品類的庫,所有產品以同樣的接口出現,從而使客戶端不依賴與具體實現
抽象工廠模式優點:
- 具體產品在應用層代碼隔離,無需關心創建細節
- 將一個系列的產品族統一到一起創建
抽象工廠模式缺點:
- 規定了所有可能被創建的產品集合,產品族中擴展新的產品等級困難,需要修改抽象工廠的接口
- 增加了系統的抽象性和理解難度
完整代碼:抽象工廠模式
總結
工廠方法模式和抽象工廠模式都是用來創建對象的設計模式。調用者無需知道對象被創建的具體過程,對調用者來說工廠類就是一個黑盒。
工廠方法模式中,每個工廠只能生產一類產品,而抽象工廠模式中,每個工廠可以生產一系列產品。