門戶網站html模板參考網是合法網站嗎?
【設計模式】JAVA 策略 工廠 模式 徹底告別switch if 等
目錄
【設計模式】JAVA 策略 工廠 模式 徹底告別switch if 等
?優(yōu)勢
?適用場景
項目結構
關鍵代碼
?優(yōu)勢
-
消除?
switch
:將分支邏輯分散到獨立的策略類中。 -
開閉原則:新增類型只需添加新的?
TypeHandler
?實現類,無需修改已有代碼。 -
依賴注入:由 Spring 管理 Bean 生命周期,天然支持單例、原型等作用域。
-
易于測試:每個策略類可單獨測試,工廠類可通過 Mock 注入。
?適用場景
-
類型數量龐大(如上百種)。
-
不同類型的處理邏輯獨立且可能頻繁變更。
-
需要動態(tài)擴展支持新類型。
項目結構
src/main/java
├── com.example.demo
│ ├── handler
│ │ ├── TypeHandler.java
│ │ ├── TypeAHandler.java
│ │ ├── TypeBHandler.java
│ │ └── DefaultHandler.java
│ ├── factory
│ │ └── TypeHandlerFactory.java
│ └── service
│ └── BusinessService.java
關鍵代碼
// TypeHandler.java
public interface TypeHandler {void handle();String getType();
}// TypeAHandler.java
@Component
public class TypeAHandler implements TypeHandler {@Overridepublic void handle() { System.out.println("處理類型A"); }@Overridepublic String getType() { return "A"; }
}// TypeHandlerFactory.java
@Component
public class TypeHandlerFactory {private final Map<String, TypeHandler> handlerMap;@Autowiredpublic TypeHandlerFactory(List<TypeHandler> handlers) {handlerMap = handlers.stream().collect(Collectors.toMap(TypeHandler::getType, handler -> handler));}public TypeHandler getHandler(String type) {return Optional.ofNullable(handlerMap.get(type)).orElseThrow(() -> new IllegalArgumentException("未知類型: " + type));}
}// BusinessService.java
@Service
public class BusinessService {private final TypeHandlerFactory handlerFactory;@Autowiredpublic BusinessService(TypeHandlerFactory handlerFactory) {this.handlerFactory = handlerFactory;}public void process(String type) {handlerFactory.getHandler(type).handle();}
}