java設計模式【工廠方法模式】
工廠方法模式
工廠方法模式(FACTORY METHOD)是一種常用的類創建型設計模式,此模式的核心精神是封裝類中變化的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦、復用和方便后期維護拓展的目的,它的核心結構有四個角色,分別是抽象工廠;具體工廠;抽象產品;具體產品,
抽象工廠角色負責定義產品的創建介面,即產品的創建程序應當被推遲到子類中實作,具體工廠角色則實作這些創建介面,并負責實際創建產品的作業,抽象產品角色是工廠方法模式的核心,它定義了一個產品的介面,但并不實作具體的產品邏輯,具體產品角色則實作這些介面并負責具體的產品邏輯,
使用工廠方法模式可以在不修改具體工廠角色的情況下引入新的產品,從而簡化了系統的設計,并提高了系統的可擴展性,
優缺點
優點:
-
系統的可擴展性非常好,因為在添加新產品時,只需要添加新的具體工廠和具體產品,而不需要修改現有系統的代碼,這樣就保證了系統的可擴展性,
-
易于維護和管理,由于工廠方法模式將創建產品的邏輯推遲到子類中實作,因此可以更容易地進行維護和管理,子類可以在不改變父類介面的情況下添加新的特性,從而減少了系統的開銷,
-
提高了系統的可靠性,因為在添加新產品時,只需要修改具體工廠類,而不需要修改客戶端代碼,這樣可以減少因客戶端代碼變化而導致的系統崩潰的可能性,
缺點:
-
增加了系統的復雜度,在實作工廠方法模式時,需要引入抽象層,這樣就增加了系統的抽象性和理解難度,同時也增加了實作的難度,
-
需要更多的代碼撰寫,使用工廠方法模式需要撰寫新的具體工廠類和具體產品類,這樣就會增加代碼的復雜度和維護的難度,
使用場景
-
產品具有復雜的結構和層次關系,需要在多個子類之間共享某些共性邏輯,使用工廠方法模式可以將這些共性邏輯提取出來,作為一個獨立的類進行封裝,從而簡化代碼并提高系統的可擴展性,
-
系統需要提供一些通用的功能,但是這些功能可能會在不同的產品中被重復使用,使用工廠方法模式可以將這些通用功能提取出來,作為一個獨立的類進行封裝,從而降低系統的開發成本,
-
系統中需要使用組件化的設計思想,將不同的組件封裝成獨立的類,使用工廠方法模式可以將這些組件的創建程序推遲到子類中實作,從而簡化代碼并提高系統的可維護性,
-
系統需要支持動態添加和洗掉產品,使用工廠方法模式可以在不修改客戶端代碼的情況下動態添加和洗掉產品,從而提高系統的靈活性和可擴展性,
具體實作
以下以產品A,產品B為例實作工廠方法模式,
抽象工廠
抽象工廠定義產品的創建介面回傳抽象產品
/**
* 抽象工廠類
*/
public interface IFactory {
/**
* 定義創建產品介面
*
* @return 抽象產品
*/
IProduct getInstance();
}
具體工廠
具體工廠繼承實作工廠實作創建產品介面回傳具體的產品
產品A工廠類
/**
* @author physicx
* @date 2023/5/15 上午10:12
* @desc 產品A具體工廠類
* Created with IntelliJ IDEA
*/
public class ProductAFactory implements IFactory {
/**
* 回傳具體產品
*
* @return 產品A
*/
@Override
public IProduct getInstance() {
return new ProductA();
}
}
產品B工廠類
/**
* @author physicx
* @date 2023/5/15 上午10:18
* @desc 產品B具體工廠
* Created with IntelliJ IDEA
*/
public class ProductBFactory implements IFactory {
/**
* 回傳具體產品
*
* @return 產品B
*/
@Override
public IProduct getInstance() {
return new ProductB();
}
}
抽象產品
抽象產品介面定義產品的默認方法和各產品實作有差異的方法
/**
* 抽象產品類
*/
public interface IProduct {
/**
* 產品公共方法
*/
default void publicMethod() {
System.out.println("公共方法");
}
/**
* 各個產品有差異方法,子類具體實作
*/
void printInfo();
}
具體產品
具體產品實作抽象產品,各個產品對方法做自己的具體實作
產品A
/**
* @author physicx
* @date 2023/5/15 上午10:13
* @desc 產品A
* Created with IntelliJ IDEA
*/
public class ProductA implements IProduct {
private final static String NAME = "產品A";
/**
* 輸出產品資訊
*/
@Override
public void printInfo() {
System.out.println("產品名稱:" + NAME);
}
}
產品B
/**
* @author physicx
* @date 2023/5/15 上午10:17
* @desc 產品B
* Created with IntelliJ IDEA
*/
public class ProductB implements IProduct {
private final static String NAME = "產品B";
/**
* 輸出產品資訊
*/
@Override
public void printInfo() {
System.out.println("產品名稱:" + NAME);
}
}
呼叫示例
public static void main(String[] args) {
//產品A工廠方法呼叫
IProduct productA = new ProductAFactory().getInstance();
productA.printInfo();
//產品工廠方法呼叫
IProduct productB = new ProductBFactory().getInstance();
productB.printInfo();
}
運行結果如下:

補充說明
后續會依次更新 詳解java 23種設計模式,歡迎關注、交流、補充相關內容(如下),
| 快捷導航 |
|---|
| 設計模式簡介總結 |
| 單例模式詳解 |
| 工廠方法模式 |
| 抽象工廠模式 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/552738.html
標籤:設計模式
上一篇:小程式安全架構分析
下一篇:返回列表
