1、定義
(Factory Method)定義一個用於創建對象的接口,讓之類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其之類。
2、使用場景
加減乘除運算,延續簡單工廠模式繼續封裝。
3、代碼結構UML圖
抽象工廠:將工廠抽象出來一個接口;
加法工廠:具體的工廠類;
運算類:運算操作抽象類;
加減乘除類:具體的運算類。
4、類的實現
(1)、AddFactory、SubFactory 、OperationMul、OperationDiv ( 具體工廠類)
public class AddFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationAdd();
}
}
public class SubFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationSub();
}
}
public class OperationMul extends Operation {
@Override
public double getResult() {
double result = 0;
result = getNumberA() * getNumberB();
return result;
}
}
public class OperationDiv extends Operation {
@Override
public double getResult() {
double result = getNumberA() / getNumberB();
return result;
}
}
(2)、Operation(運算抽象類)
public class Operation {
private double numberA = 0;
private double numberB = 0;
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
public double getResult() {
double result = 0;
return result;
}
}
(3)、OperationAdd、OperationSub、OperationMul、OperationDiv(具體運算類)
public class OperationAdd extends Operation {
@Override
public double getResult() {
double result = 0;
result = getNumberA() + getNumberB();
return result;
}
}
public class OperationSub extends Operation {
@Override
public double getResult() {
double result = 0;
result = getNumberA() - getNumberB();
return result;
}
}
public class OperationMul extends Operation {
@Override
public double getResult() {
double result = 0;
result = getNumberA() * getNumberB();
return result;
}
}
public class OperationDiv extends Operation {
@Override
public double getResult() {
double result = getNumberA() / getNumberB();
return result;
}
}
5、客戶端調用
public static void main(String[] args) {
IFactory mulFactory = new MulFactory();
Operation operation = mulFactory.createOperation();
operation.setNumberA(1);
operation.setNumberB(2);
double result=operation.getResult();
System.out.println("計算結果:"+result);
}
輸出:
6、總結
工廠方法模式實現時,客戶端需要覺得實例化哪一個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,工廠方法把簡單工廠的內部邏輯判斷移到了客戶端代碼來進行。你想要加功能,本來是改工廠類的,而現在是修改客戶端。
參考:《大話設計模式》