一、什么是工廠方法模式
????????工廠模式又稱工廠方法模式,是一種創建型設計模式,其在父類中提供一個創建對象的方法, 允許子類決定實例化對象的類型。工廠方法模式是目標是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類中。這種設計模式也是 Java 開發中最常見的一種模式,它的主要意圖是定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創建過程延遲到子類進行。
二、場景模擬
? ? ? ? 假設我們要給一個成本計算系統設計一套各種材料的成本計算。其中材料有鋼板、油漆、運輸等成本,每個成本需要計算單條記錄成本,本周成本和月度成本。
三、業務實現
? ? ? ? 首先我們定義一下成本接口?ICosts,里面有三個方法,分別是SingleCosts(),WeekCosts()和
MonthCosts()。
3.1、定義成本接口
成本接口?ICosts,模擬三個方法,計算單個成本、本月成本和本周成本;
public interface ICosts {/*** 單成本計算*/void SingleCosts();/*** 周成本計算*/void WeekCosts();/*** 月成本計算*/void MonthCosts();
}
3.2、定義具體實現類?
首先是鋼板類材料實現類
public class GBCosts implements ICosts {@Overridepublic void SingleCosts() {System.out.println("計算鋼板成本");}@Overridepublic void WeekCosts() {System.out.println("計算本周鋼板成本");}@Overridepublic void MonthCosts() {System.out.println("計算本月鋼板成本");}
}
然后是油漆
public class YQCosts implements ICosts {@Overridepublic void SingleCosts() {System.out.println("計算油漆成本");}@Overridepublic void WeekCosts() {System.out.println("計算本周油漆成本");}@Overridepublic void MonthCosts() {System.out.println("計算本月油漆成本");}
}
最后是運輸
public class YSCosts implements ICosts {@Overridepublic void SingleCosts() {System.out.println("計算運輸成本");}@Overridepublic void WeekCosts() {System.out.println("計算本周運輸成本");}@Overridepublic void MonthCosts() {System.out.println("計算本月運輸成本");}
}
3.3、定義成本計算工廠
public class CostsFactory {public ICosts getCostsService(String name) {switch (name) {case "GB":return new GBCosts();case "YQ":return new YQCosts();case "YS":return new YSCosts();default:throw new RuntimeException("不錯在此成本計算服務");}}
}
3.4、測試
public static void main(String[] args) {CostsFactory costsFactory = new CostsFactory();ICosts GBCosts = costsFactory.getCostsService("GB");GBCosts.SingleCosts();GBCosts.WeekCosts();GBCosts.MonthCosts();ICosts YQCosts = costsFactory.getCostsService("YQ");YQCosts.SingleCosts();YQCosts.WeekCosts();YQCosts.MonthCosts();}
可以看到既滿足了業務的需求,也滿足了自己對代碼的追求。這樣的代碼不必有大量的if-else存在,而且擴展性更強,代碼結構更加清晰。
四、總結
????????工廠方法模式(Factory Method Pattern)是一種創建型設計模式,用于創建對象的過程被推遲到子類中進行,這樣可以使一個類的實例化延遲到其子類。這種模式通過定義一個創建對象的接口,但是由子類決定要實例化的類是哪一個。
? ? ? ? 當使用時只需要調用抽象工廠接口來創建即可,不需要了解具體的實現和創建邏輯。例如在數據庫操作中,針對不同的數據庫類型(Mysql、Oracle等)可以使用不同的數據庫連接對象,工廠方法可以根據需要創建不同類型的連接對象。
????????通過工廠方法,我們可以在客戶端代碼中對產品的具體類型進行抽象,并通過子類來創建相應的對象,從而提供了更大的靈活性和可擴展性。