有時單個設(shè)計模式并不能滿足我們的業(yè)務(wù)需求,這個時候就要根據(jù)具體的業(yè)務(wù)來混合使用設(shè)計模式,其中策略模式和工廠模式是比較常用的一個組合。工廠模式可以管理具體策略的生命周期,策略模式可以豐滿具體細(xì)節(jié)的邏輯。
代碼示例
interface Strategy {
void execute();
}
// 具體策略類1
class StrategyImpl1 implements Strategy {
@Override
public void execute() {
System.out.println("執(zhí)行策略1");
}
}
// 具體策略類2
class StrategyImpl2 implements Strategy {
@Override
public void execute() {
System.out.println("執(zhí)行策略2");
}
}
// 工廠接口
interface Factory {
Strategy createStrategy();
}
// 具體工廠類1
class FactoryImpl1 implements Factory {
@Override
public Strategy createStrategy() {
return new StrategyImpl1();
}
}
// 具體工廠類2
class FactoryImpl2 implements Factory {
@Override
public Strategy createStrategy() {
return new StrategyImpl2();
}
}
// 測試類
public class Main {
public static void main(String[] args) {
Factory factory1 = new FactoryImpl1();
Strategy strategy1 = factory1.createStrategy();
strategy1.execute();
Factory factory2 = new FactoryImpl2();
Strategy strategy2 = factory2.createStrategy();
strategy2.execute();
}
}
在這個示例中,我們定義了一個策略接口和兩個具體策略類。然后,我們創(chuàng)建了一個工廠接口和兩個具體工廠類,每個工廠類負(fù)責(zé)創(chuàng)建不同的策略實例。最后,在測試類中,我們使用工廠類創(chuàng)建了不同的策略實例,并調(diào)用它們的執(zhí)行方法。
以上只是個簡單的示例,我們可以把工廠模式用map改進(jìn)一下,并不需要這么多的子工廠類。
interface Strategy {
void execute();
}
// 具體策略類1
class StrategyImpl1 implements Strategy {
@Override
public void execute() {
System.out.println("執(zhí)行策略1");
}
@PostConstruct
public void registryFactory(){
Factory.CHOOSER_MAP.registry("1",this);
}
}
// 具體策略類2
class StrategyImpl2 implements Strategy {
@Override
public void execute() {
System.out.println("執(zhí)行策略2");
}
@PostConstruct
public void registryFactory(){
Factory.CHOOSER_MAP.registry("2",this);
}
}
// 工廠接口
public class Factory {
private final static Map<String, Strategy > CHOOSER_MAP = new ConcurrentHashMap<>();
public static void registry(String code, Strategy strategy ) {
CHOOSER_MAP.put(code, strategy );
}
public static Strategy chose(String code) {
CHOOSER_MAP.get(code);
}
}
// 測試類
public class Main {
public static void main(String[] args) {
StrategyImpl1 StrategyImpl1 = PlatformChooserFactory.chose(“1”);
StrategyImp2 StrategyImpl2 = PlatformChooserFactory.chose(2”);
}
}
以上就是改造后的代碼,這樣就比較簡單直觀了。工廠類中我們使用map去存儲具體的策略類,并且提供注冊和獲取方法。具體策略類在初始化的時候,會把當(dāng)前類注冊到工廠類的map中。這樣我們使用的時候,只要根據(jù)具體的key就可以拿到具體的策略類。
優(yōu)缺點
優(yōu)點:
- 靈活性:策略模式允許在運(yùn)行時選擇不同的策略,而工廠模式可以根據(jù)需求創(chuàng)建相應(yīng)的對象。這種組合可以使系統(tǒng)更加靈活,能夠根據(jù)不同的需求選擇合適的策略和對象。
- 可擴(kuò)展性:通過工廠模式,可以輕松添加新的具體產(chǎn)品或策略,而無需修改現(xiàn)有代碼。這使得系統(tǒng)更容易擴(kuò)展,可以根據(jù)需要動態(tài)添加新的產(chǎn)品和策略。
- 代碼復(fù)用:策略模式和工廠模式都鼓勵代碼的重用。策略模式中的策略和工廠模式中的產(chǎn)品可以在不同的上下文中被重復(fù)使用,避免了重復(fù)編寫相似的代碼。
- 松耦合:策略模式和工廠模式的結(jié)合可以實現(xiàn)松耦合的設(shè)計。策略模式通過接口與具體策略解耦,工廠模式通過抽象工廠與具體產(chǎn)品解耦。這種松耦合設(shè)計使得系統(tǒng)更加靈活、可維護(hù)和可測試。
缺點:文章來源:http://www.zghlxwxcb.cn/news/detail-732002.html
- 增加復(fù)雜性:使用策略模式和工廠模式的混合會增加代碼的復(fù)雜性,需要定義多個接口、類和實現(xiàn)。這可能會增加開發(fā)和維護(hù)的成本。
- 增加類的數(shù)量:使用策略模式和工廠模式的混合可能導(dǎo)致類的數(shù)量增加,特別是在有多個具體策略和產(chǎn)品時。這可能會增加系統(tǒng)的復(fù)雜性和內(nèi)存占用。
總結(jié)
需要根據(jù)具體的應(yīng)用場景和需求來權(quán)衡使用策略模式和工廠模式的混合。在某些情況下,這種組合可以提供更靈活、可擴(kuò)展和可維護(hù)的設(shè)計,但也需要考慮代碼復(fù)雜性和類的數(shù)量增加的影響。文章來源地址http://www.zghlxwxcb.cn/news/detail-732002.html
到了這里,關(guān)于設(shè)計模式:策略模式和工廠模式混合使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!