1. 簡單工廠模式
1.1要點
- 對於一組相關的策略類:使用接口+多個實現類
- 使用簡單工廠創建策略類, 將具體類對客戶代碼封裝
1.2 代碼
public interface IStrategy{
public void run();
}
public class StrategyA implements IStrategy{
public void run(){
//具體策略
}
}
public class StrategyB implements IStrategy{
public void run(){
//具體策略
}
}
public class StrategyFactory{
public static IStrategy create(String strategy){
if(strategy.equals("A"))
return new StrategyA();
else if(strategy.equals("B))
return new StrategyB();
else
throw IllegalArgumentException("暫不支持策略:" + strategy);
}
}
public class Main{
public static void main(String[] args){
IStrategy strategy = StrategyFactory.create(args[0]);
strategy.run();
}
}
1.3 總結
將具體策略類向客戶隱藏. 如果需要擴展策略,僅需提供新策略的實現,並在策略工廠中增加對新策略的支持.
2 簡單工廠方法+策略模式
2.1 要點
對工廠方法進行修改,在簡單工廠模式中,工廠僅僅負責創建策略對象.策略的具體執行需要通過返回的策略對象進行相應方法調用.
通過將簡單工廠方法與策略模式相結合,構建策略上下文類,該類可以通過傳入的策略類別構造對應的實際策略,並提供具體策略方法的執行.
2.2 代碼
IStrategy
,StrategyA
,StrategyB
定義與簡單工廠方法中一致
public class StrategyContext{
private IStrategy strategy;
public StrategyContext(String strategy){
if(strategy.equals("A))
this.strategy = new StrategyA();
else if(strategy.equlas("B"))
this.strategy = new StrategyB();
else
throw new IllegalArgumentException("暫不支持策略:"+strategy);
}
public void run(){
strategy.run();
}
}
public class Main{
public static void main(String[] args){
StrategyContext strategy = new StrategyContext(args[0]);
strategy.run();
}
}
2.3 總結
通過將簡單工廠方法與策略模式相結合,對用戶端僅需暴露一個類即可.進一步提供了客戶端調用的透明性.