一、簡單工廠模式
簡單工廠模式將對象的建立與使用解耦,由工廠負責創建具體對象,應用需要對象時只需調用工廠類的API即可。
比如編寫一個計算器、可使用工廠模式
如上圖所示,加減乘除分別繼承Operation類,重寫getResult方法。
ComputerFactory爲工廠類
public class ComputerFactory {
//由工廠類根據不同運算符生成需要的執行的操作
public static Operation getOperation(char operate){
Operation operation = null;
switch (operate){
case '+':
operation = new Add();
break;
case '-':
operation = new Sub();
break;
case '*':
operation = new Mul();
break;
case '/':
operation = new Div();
break;
}
return operation;
}
}
計算器工廠可根據操作符返回具體的操作類,實現應用和對象創建的解耦。
二、策略模式
雖然簡單工廠模式實現了對象創建和應用的解耦,但當需求頻繁發生變化是,比如需要添加一個sqrt
運算,這種問題可用策略模式解決。
策略模式(Strategy),定義了一組算法,將每個算法都封裝起來,並且使它們之間可以互換。UML結構圖如下。
Context上下文
Context上下文角色,也叫Context封裝角色,起承上啓下的作用,屏蔽高層模塊對策略、算法的直接訪問,封裝可能存在的變化,計算器的Context如下
public class Context {
//strategy
public Operation operation = null;
public Context(char operate){
switch (operate){
case '+':
operation = new Add();
break;
case '-':
operation = new Sub();
break;
case '*':
operation = new Mul();
break;
case '/':
operation = new Div();
break;
}
}
//由Context執行封裝好的算法
public double doWork(int num1,int num2){
operation.setNum1(num1);
operation.setNum2(num2);
return operation.getResult();
}
}
Strategy就是計算器中的Operation。
三、兩種模式的客戶端調用
public class Main {
public static void main(String[] args) {
//請求工廠返回需要的運算實例
Operation operation = ComputerFactory.getOperation('+');
operation.setNum1(12);
operation.setNum2(23);
System.out.println(operation.getResult());//由工廠返回的實例執行運算
//生成算法定義的策略上下文
Context context = new Context('-');
System.out.println(context.doWork(1,2));//由context去執行算法,降低算法和調用者的耦合
}
四、總結
工廠模式中只管生產實例,具體怎麼使用工廠實例由調用方決定,策略模式是將生成實例的使用策略放在策略類中配置後才提供調用方使用。 工廠模式調用方可以直接調用工廠實例的方法屬性等,策略模式不能直接調用實例的方法屬性,需要在策略類中封裝策略後調用。