1. 程式人生 > >設計模式:簡單工廠與策略模式

設計模式:簡單工廠與策略模式

簡單工廠,真的是特別簡單的一個設計模式。
工廠方法內定義需要用到的方法的父類,
根據傳遞的引數來決定例項化何種子類物件。

//演算法的父類,抽象出返回結果的介面
public interface Operation {
    public abstract double getResult(double a,double b);
}

//工廠類,用於生產相應的演算法子類
public class OperationFactory {
    public Operation CreateOperation(String str){
        Operation ope=null;
        switch
(str){ case "+": ope=new OperationAdd(); break; case "-": ope=new OperationSub(); break; } return ope; } } //演算法子類,由工廠類建立,重寫父類中的虛擬函式 public class OperationAdd implements Operation { @Override
public double getResult(double a, double b) { return a+b; } }

策略模式

摘自百度百科

策略模式是指對一系列的演算法定義,並將每一個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法獨立於使用它的客戶而獨立變化。
策略模式的優點有:策略模式提供了管理相關的演算法族的辦法、策略模式提供了可以替換繼承關係的辦法、使用策略模式可以避免使用多重條件轉移語句。

Strategy提供一個介面,供演算法實現
ConcreteStrategy 具體實現類
Context 維護一個Strategy物件,使用ConcreteStrategy的方法,動態設定 需要執行的方法

Strategy.java

public interface Strategy {
    public String  printAnswer();
}

ConcreteStrategy.java

public class ConcreteStrategy1 implements Strategy {
    @Override
    public String printAnswer() {
        return "this is method 1";
    }
}

Context.java

public class Context {
    private Strategy strategy;

    Context(Strategy strategy){
        this.strategy=strategy;
    }

    public String getResult(){
        return strategy.printAnswer();
    }
}



Client.java

public class Client {
  public static void main(String args[]){
      Context context=null;
      context=new Context(new ConcreteStrategy1());
      System.out.println(context.getResult());
  }
}

策略模式與簡單工廠結合

Context.java

public class Context {
    private Strategy strategy;
    Context(String type){
        switch (type){
            case "1":
                strategy=new ConcreteStrategy1();
                break;
            case "2":
                strategy=new ConcreteStrategy2();
                break;
        }
    }

    public String getResult(){
        return strategy.printAnswer();
    }

}

Client.java

public class Client {
  public static void main(String args[]){
      Context context=null;
      context=new Context("1");
      System.out.println(context.getResult());
      context=new Context("2");
      System.out.println(context.getResult());
  }
}