以用戶選擇器為例:
// 1. 定義統一介面
public interface UserSelector {
List select(SelectContext ctx); // 封裝通用參數
boolean supports(ProductType type);
}
// 2. 各產品實現
@Component
public class ProductAUserSelector implements UserSelector {
public boolean supports(ProductType type) { return type == ProductType.A; }
public List select(SelectContext ctx) { /* A 產品專屬邏輯 */ }
}
// 3. 工廠路由
@Service
public class UserSelectorFactory {
private final Map selectors = new EnumMap<>(ProductType.class);
@Autowired
public UserSelectorFactory(List list) {
list.forEach(s -> Arrays.stream(ProductType.values())
.filter(s::supports).forEach(t -> selectors.put(t, s)));
}
public UserSelector get(ProductType type) { return selectors.get(type); }
}
// 4. 調用端
UserSelector selector = factory.get(currentProductType());
List users = selector.select(context);
**收益**:新增產品只需加實現類,零修改舊代碼,符合開閉原則。
**切記**:不徹底的重構比不重構更危險。要么不動,動則徹底。