簡單工廠 、工廠方法模式和抽象工廠模式
1.模式性質與定位
簡單工廠:并非正式的設計模式(屬編程習慣),通過單一工廠類根據參數判斷創建不同產品,本質是將對象創建邏輯集中管理。
工廠方法:是標準的創建型設計模式,定義抽象創建接口,由子類決定實例化哪個具體產品類,強調 “單一產品” 的靈活創建。
抽象工廠:同樣是創建型設計模式,聚焦 “產品族” 的創建,一個工廠類負責創建一組相關產品(如手機、耳機、充電器組成的電子產品族)。
2產品創建范圍
簡單工廠、工廠方法:側重單個產品的創建。例如,創建 “手機” 這一產品,簡單工廠通過條件判斷決定具體手機類型,工廠方法通過子類工廠創建特定手機。
抽象工廠:關注多個相關產品的組合創建。如創建 “手機 + 耳機” 的產品族,抽象工廠需定義多個創建方法,分別生成不同類型的產品。
3.擴展性與開閉原則
簡單工廠:擴展性差。新增產品時需修改工廠類的創建邏輯(如添加if-else或switch分支),違反開閉原則。
工廠方法:擴展性好。新增產品時,只需定義新的產品類和對應的工廠子類,無需修改原有工廠代碼,完全符合開閉原則。
抽象工廠:擴展性較復雜。新增產品族時,可通過擴展工廠子類實現;但新增某一產品類型(如產品族中新增 “平板”),需修改抽象工廠接口及所有具體工廠類,違背開閉原則。
- 結構復雜度
簡單工廠:結構最簡單,僅一個工廠類處理所有產品創建邏輯。
工廠方法:復雜度適中,包含抽象產品、具體產品、抽象工廠、具體工廠等類,需為每個產品設計對應的工廠子類。
抽象工廠:結構最復雜,涉及多個產品接口、多個具體產品類,以及包含多個創建方法的抽象工廠和具體工廠類,代碼量和類關系更多。 - 典型應用場景
簡單工廠:適用于產品種類少、創建邏輯不復雜,且后續擴展需求低的場景,如簡單的日志記錄器創建。
工廠方法:適用于需要靈活擴展產品類型的場景,如不同數據庫連接對象的創建(新增數據庫類型時,擴展工廠子類即可)。
抽象工廠:適用于產品需成族搭配使用的場景,如跨平臺 UI 組件(Windows 和 Mac 的 “按鈕 + 文本框” 組件族,通過抽象工廠創建對應平臺的組件組合)。
4. 簡單工廠模式
- 定義支付接口
public interface Payment {String pay(String orderId, double amount);
}
2.實現微信支付類
public class WeChatPayment implements Payment {@Overridepublic String pay(String orderId, double amount) {return "使用微信支付,訂單號:" + orderId + ",金額:" + amount;}
}
3.實現支付寶支付類
public class AlipayPayment implements Payment {@Overridepublic String pay(String orderId, double amount) {return "使用支付寶支付,訂單號:" + orderId + ",金額:" + amount;}
}
- 創建簡單工廠類
public class PaymentFactory {public static Payment createPayment(String payType) {if ("wechat".equals(payType)) {return new WeChatPayment();} else if ("alipay".equals(payType)) {return new AlipayPayment();}return null;}
}
- 客戶端調用
public class