工廠方法模式(FACTORY METHOD)是一種常用的對象創建型設計模式,此模式的核心精神是封裝類中不變的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦、復用和方便后期維護拓展的目的。它的核心結構有四個角色,分別是抽象工廠;具體工廠;抽象產品;具體產品。
外文名 Factory Method
工廠方法(Factory Method)模式的意義是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先完全實現‘開-閉 原則’,實現了可擴展。其次更復雜的層次結構,可以應用于產品結果復雜的場合。
工廠方法模式對簡單工廠模式進行了抽象。有一個抽象的Factory類(可以是抽象類和接口),這個類將不再負責具體的產品生產,而是只制定一些規范,具體的生產工作由其子類去完成。在這個模式中,工廠類和產品類往往可以依次對應。即一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品,這個具體的工廠就負責生產對應的產品。
工廠方法模式(Factory Method pattern)是最典型的模板方法模式(Template Method pattern)應用。
角色結構
抽象工廠(Creator)角色:是工廠方法模式的核心,與應用程序無關。任何在模式中創建的對象的工廠類必須實現這個接口。
具體工廠(Concrete Creator)角色:這是實現抽象工廠接口的具體工廠類,包含與應用程序密切相關的邏輯,并且受到應用程序調用以創建產品對象。在上圖中有兩個這樣的角色:BulbCreator與TubeCreator。
抽象產品(Product)角色:工廠方法模式所創建的對象的超類型,也就是產品對象的共同父類或共同擁有的接口。在上圖中,這個角色是Light。
具體產品(Concrete Product)角色:這個角色實現了抽象產品角色所定義的接口。某具體產品有專門的具體工廠創建,它們之間往往一一對應。
代碼實現:
首先我們通過介紹得知。我們需要一個抽象的工廠方法類、一個抽象的產品類和一個具體的產品類與一個具體的工廠類,我們具體工廠類需要實現抽象工廠方法中的抽象方法。
這里以一個文件導出的例子來做個示范:
首先我們需要一個抽象的產品
導出的API接口:ExportAPI
public interface ExportAPI {
boolean export(String data);
}
我們再來一個抽象的工廠方法:
public abstract class ExportMethod {
public boolean export(String name){
ExportAPI api = getExportAPI();
return api.export(name);
}
public abstract ExportAPI getExportAPI();
}
我們有工廠有產品,接著我們來個具體的產品:
導出文件:ExportFileAPI
public class ExportFileAPI implements ExportAPI {
@Override
public boolean export(String name) {
// 示意方法
System.out.println("導出文件->:" + name + "成功");
return true;
}
}
我們再來個生產產品的方法:
public class ExportFileMethod extends ExportMethod{
@Override
public ExportAPI getExportAPI() {
return new ExportFileAPI();
}
}
現在我們有工廠有產品,來創建一個客戶端體驗一把。
public class Client {
public static void main(String[] args) {
ExportMethod api = new ExportFileMethod();
api.export("今日的財務報表");
}
}
以上便是工廠方法的簡單應用。