工廠方法模式一種創(chuàng)建對象的模式植兰,下面通過實際的例子來體會
例子:比如輸入兩個數(shù)字,計算兩個數(shù)字的加減乘除雇庙,然后打印結(jié)果
如果不使用工廠的方式
@Test
public void noFactory(){
operation(8,9,"+");
}
public int operation(int numA,int numB,String operation){
switch (operation){
case "+":
return numA+numB;
case "-":
return numA-numB;
case "*":
return numA*numB;
case "/":
return numA/numB;
default:
return 0;
}
}
operation這個方法里邊進(jìn)行了判斷處理谓形,這個方法里邊耦合了具體的計算邏輯灶伊。
如果需要修改case中的一個某個算法疆前,就可能會影響到其他的算法,怎么辦呢聘萨?
下面來看下如果改成使用簡單工廠的設(shè)計模式
//定義一個抽象類Operation
public abstract class Operation {
public double numberA;
public double numberB;
//定義一個抽象方法用于獲取結(jié)果
public abstract double getResult();
}
//加法
public class OperationAdd extends Operation {
@Override
public double getResult() {
return numberA + numberB;
}
}
//減法
public class OperationSub extends Operation {
@Override
public double getResult() {
return numberA - numberB;
}
}
//乘法
public class OperationMul extends Operation {
@Override
public double getResult() {
return numberA * numberB;
}
}
//除法
public class OperationDiv extends Operation {
@Override
public double getResult() {
return numberA / numberB;
}
}
//定義一個工廠
public class OperationFactory {
public static Operation createOperation(String operation) {
Operation op = null;
switch (operation) {
case "+":
op = new OperationAdd();
break;
case "-":
op = new OperationSub();
break;
case "*":
op = new OperationMul();
break;
case "/":
op = new OperationDiv();
break;
default:
Log.e("lpf", "input operation is error");
break;
}
return op;
}
}
public class Client {
@Test
public void testFactory(){
Operation operation = OperationFactory.createOperation("+");
operation.numberA=10;
operation.numberB=16;
operation.getResult();
}
}
我們來看下簡單工廠的類圖
簡單工廠將算法部分封裝到類里邊了竹椒,那么如果想修改某個算法對其他的不會產(chǎn)生應(yīng)用。
如果需要修改某個算法直接修改對應(yīng)的類就可以米辐,對其他的算法是沒有影響胸完。
那么如果我新增一個算法,就需要在工廠這個類新增一個case翘贮,按照開閉原則里的對修改關(guān)閉的原則赊窥,顯然還是存在問題。怎么辦呢狸页?
我們繼續(xù)對上面的簡單工廠進(jìn)行改造锨能,使用工廠方法的設(shè)計模式
//定義一個抽象類Operation
public abstract class Operation {
public double numberA;
public double numberB;
//定義一個抽象方法用于獲取結(jié)果
public abstract double getResult();
}
//加法
public class OperationAdd extends Operation {
@Override
public double getResult() {
return numberA + numberB;
}
}
//減法
public class OperationSub extends Operation {
@Override
public double getResult() {
return numberA - numberB;
}
}
//乘法
public class OperationMul extends Operation {
@Override
public double getResult() {
return numberA * numberB;
}
}
//除法
public class OperationDiv extends Operation {
@Override
public double getResult() {
return numberA / numberB;
}
}
public interface IFactory {
//抽象工廠,定義操作算法的接口
Operation concreteOperation();
}
//加法工廠
public class FactoryAdd implements IFactory {
@Override
public Operation concreteOperation() {
return new OperationAdd();
}
}
//減法工廠
public class FactorySub implements IFactory {
@Override
public Operation concreteOperation() {
return new OperationSub();
}
}
//乘法工廠
public class FactoryMul implements IFactory{
@Override
public Operation concreteOperation() {
return new OperationMul();
}
}
//除法工廠
public class FactoryDiv implements IFactory {
@Override
public Operation concreteOperation() {
return new OperationDiv();
}
}
public class Client {
@Test
public void testFactoryMethod(){
// 需要什么算法直接創(chuàng)建相應(yīng)的算法工廠
// 需求變更只需要需改某個算法類
// 需求增加只需要相應(yīng)的增加工廠和算法就可以擴(kuò)展也很方便芍耘。
IFactory factory=new FactoryAdd();
Operation operation = factory.concreteOperation();
operation.numberA=10;
operation.numberB=16;
operation.getResult();
}
}
工廠方法的設(shè)計模式類圖
工廠設(shè)計模式總結(jié)
- 工廠方法模式一種創(chuàng)建對象的模式
- 能夠很好的封裝方法細(xì)節(jié)
- 完美的體現(xiàn)了面向接口編程址遇,體現(xiàn)了面向?qū)ο蟮乃枷搿?/li>
- 編程是一門藝術(shù),大批量的改動顯然是非常丑陋的做法斋竞,用心的琢磨寫的代碼讓它變的更美觀倔约。