文檔查閱說明:
定義:定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類
使用場景:
● 日誌記錄器:記錄可能記錄到本地硬盤、系統事件、遠程服務器等,用戶可以選擇記錄日誌到什麼地方;
● 數據庫訪問,當用戶不知道最後系統採用哪一類數據庫,以及數據庫可能有變化時;
● 設計一個連接服務器的框架,需要三個協議,"POP3"、"IMAP"、"HTTP",可以把這三個作爲產品類,共同實現一個接口
public abstract 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 abstract double getResult();
}
public class OperationAdd extends Operation {
@Override
public double getResult() {
return this.getNumberA() + this.getNumberB();
}
}
public class OperationSub extends Operation {
@Override
public double getResult() {
return this.getNumberA() - this.getNumberB();
}
}
public class OperationMul extends Operation {
@Override
public double getResult() {
return this.getNumberA() * this.getNumberB();
}
}
public class OperationDiv extends Operation {
@Override
public double getResult() {
if(this.getNumberB() == 0) {
try {
throw new Exception("除數不能爲0");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return this.getNumberA() / this.getNumberB();
}
}
public class OperationFactory {
public static Operation createOperation(String operate) {
Operation oper = null;
switch (operate) {
case "+":{
oper = new OperationAdd();
break;
}
case "-":{
oper = new OperationSub();
break;
}
case "*":{
oper = new OperationMul();
break;
}
case "/":{
oper = new OperationDiv();
break;
}
default:{
try {
throw new Exception("操作符不匹配");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return oper;
}
public static double getResult(String operate, double numberA, double numberB) {
Operation oper = null;
switch (operate) {
case "+":{
oper = new OperationAdd();
break;
}
case "-":{
oper = new OperationSub();
break;
}
case "*":{
oper = new OperationMul();
break;
}
case "/":{
oper = new OperationDiv();
break;
}
default:{
try {
throw new Exception("操作符不匹配");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
oper.setNumberA(numberA);
oper.setNumberB(numberB);
return oper.getResult();
}
}
public class Test {
public static void main(String[] args) {
Operation oper = OperationFactory.createOperation("+");
oper.setNumberA(1);
oper.setNumberB(2);
double result = oper.getResult();
System.out.println(result);
System.out.println(OperationFactory.getResult("+", 1, 2));
}
}