簡言:
java有二十三種設計模式,面試時幾乎面試官都會問你知道哪些設計模式,單例模式,裝飾模式,工廠模式,外觀模式,建造者模式,適配器模式等等,不單單面試中需要你的瞭解滲透,在實際開發中也是大有用途的。今天主要說的是工廠模式,會以案例的形式講解。
簡單理解什麼是工廠:
簡單說,就是到底要實例化誰,會不會增加實例化對象,所以要用一個單獨的類做這個創建實例的過程,就是工廠;
今天主要講解分爲三部分:
1.什麼是簡單工廠模式
2.什麼是工廠方法模式
3.兩者之間的對比(優缺點)
我們今天通過“計算器” 功能對工廠模式進行講解:
一。簡單工廠模式
工廠類代碼:
public class OperationFactory {
public static Operation createOperatie(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;
}
return oper;
}
}
客戶端實現:
/**
* 簡單工廠模式
* */
private void initUI() {
Operation oper = OperationFactory.createOperatie("+");
oper.setNumA(1);
oper.setNumB(2);
double v = oper.GetResult();
Toast.makeText(FactoryActivity.this, "結果爲:" + v, Toast.LENGTH_SHORT).show();
}
通過代碼我們能看出,只要輸入運算符號,工廠就實例出合適的對象,通過多態反饋給父類實現的結果;
如果我們添加複雜的運算,比如立方根等,我們添加運算的子類就夠了,在工廠類中添加分支,就能實現。
我將功能運算類分享給大家(計算加減乘除類)
/**
* 計算加法類 並返回結果
* */
public class OperationAdd extends Operation {
@Override
public double GetResult() {
double result = 0;
result = this.getNumA() + this.getNumB();
return result;
}
}
/**
* 計算減法類 並返回結果
* */
public class OperationSub extends Operation{
@Override
public double GetResult() {
double result = 0;
result = this.getNumA() - this.getNumB();
return result;
}
}
/**
* 計算乘法類 並返回結果
* */
public class OperationMul extends Operation {
@Override
public double GetResult() {
double result = 0;
result = this.getNumA() * this.getNumB();
return result;
}
}
/**
* 計算除法類並返回結果
* */
public class OperationDiv extends Operation {
@Override
public double GetResult() {
double result = 0;
if (this.getNumB() == 0) {
return 0;
} else {
result = this.getNumA() / this.getNumB();
return result;
}
}
}
二.工廠方法模式
步驟:
1.創建一個工廠接口,運算類分別實現該接口
/**
* 創建一個工廠接口
* */
public interface IFatory {
Operation CreateOperation();
}
2.運算類建一個具體工廠去實現這個接口
/**
* 創建一個加法工廠,實現工廠接口
* */
public class AddFatory implements IFatory {
@Override
public Operation CreateOperation() {
return new OperationAdd();
}
}
/**
* 創建一個減法工廠,實現工廠接口
* */
public class SubFactory implements IFatory {
@Override
public Operation CreateOperation() {
return new OperationSub();
}
}
/**
* 創建一個除法工廠,實現工廠接口
* */
public class DivFactory implements IFatory {
@Override
public Operation CreateOperation() {
return new OperationDiv();
}
}
/**
* 創建一個乘法工廠,實現工廠接口
* */
public class MulFactory implements IFatory {
@Override
public Operation CreateOperation() {
return new OperationMul();
}
}
在客戶端實現功能得到結果:
/**
* 工廠方法模式
* */
private void initUI2() {
IFatory operFactory = new AddFatory();
Operation operation = operFactory.CreateOperation();
operation.setNumA(3);
operation.setNumB(5);
double v = operation.GetResult();
Toast.makeText(FactoryActivity.this, "結果爲:" + v, Toast.LENGTH_SHORT).show();
}
三: 簡單工廠 VS 工廠方法
他們的區別所在,簡單工廠模式的最大優點就在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇動態的實例化相關的類,
對於客戶端來說,祛除了與產品的依賴,
當時如果加入一個立方根功能。我們要在運算的工廠類方法中添加case 分支,相當於對外擴展開放了,對修改也開放了,違背了
開放--封閉原則;這個時候我們選擇了工廠方法:
兩者的結構圖:
總結:
工廠方法約束了簡單工廠違背的開放-封閉原則的缺點,又保持了封裝對象創建過程的優點。它們都是集中封裝了對象的創建,更換對象時,不需要大的改動,降低了客戶程序與產品對象的耦合,工廠方法模式就是簡單工廠模式的進一步的優化,由於使用了多態性,保持了簡單工廠模式的優點,克服了缺點;