創(chuàng)建型設(shè)計模式-簡單工廠與工廠方法設(shè)計模式

工廠方法模式一種創(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();
    }
}

我們來看下簡單工廠的類圖


image-20211229110855303.png

簡單工廠將算法部分封裝到類里邊了,那么如果想修改某個算法對其他的不會產(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)的增加工廠和算法就可以擴展也很方便。
        IFactory factory=new FactoryAdd();
        Operation operation = factory.concreteOperation();
        operation.numberA=10;
        operation.numberB=16;
        operation.getResult();
    }
}

工廠方法的設(shè)計模式類圖

image-20211229185228642.png

工廠設(shè)計模式總結(jié)

  • 工廠方法模式一種創(chuàng)建對象的模式
  • 能夠很好的封裝方法細(xì)節(jié)
  • 完美的體現(xiàn)了面向接口編程,體現(xiàn)了面向?qū)ο蟮乃枷搿?/li>
  • 編程是一門藝術(shù),大批量的改動顯然是非常丑陋的做法,用心的琢磨寫的代碼讓它變的更美觀。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容