設計模式-工廠方法模式

    本篇文章主要講解工廠方法模式。工廠方法模式:定義一個用於建立對象的接口,讓子類去決定實例化哪個類。工廠方法使一個類的實例化延遲到其子類。git

    在看工廠方法模式以前先寫個簡單的計算器看下簡單工廠。github

    先看下結構圖。ide

 

 

    接着看下代碼實現。測試

    首先建立一個運算抽象類。spa

package com.lwx.factory;

/**
 * Created with IntelliJ IDEA.
 * Description: 運算抽象類
 * User: lwx
 * Date: 2019-03-09
 * Time: 20:45
 */
public abstract class Operation {

    double numberA = 0;
    double numberB = 0;

    abstract double getResult();

}

    而後是四種運算的實現類。code

package com.lwx.factory;

/**
 * Created with IntelliJ IDEA.
 * Description: 加法實現類
 * User: lwx
 * Date: 2019-03-09
 * Time: 20:47
 */
public class OperationAdd extends Operation {

    double getResult() {
        return numberA + numberB;
    }

}

 

package com.lwx.factory;

/**
 * Created with IntelliJ IDEA.
 * Description: 減法實現類
 * User: lwx
 * Date: 2019-03-09
 * Time: 20:48
 */
public class OperationSub extends Operation {

    double getResult() {
        return numberA - numberB;
    }
}

 

package com.lwx.factory;

/**
 * Created with IntelliJ IDEA.
 * Description: 乘法實現類
 * User: lwx
 * Date: 2019-03-09
 * Time: 20:49
 */
public class OperationMul extends Operation {

    double getResult() {
        return numberA * numberB;
    }

}

 

package com.lwx.factory;

/**
 * Created with IntelliJ IDEA.
 * Description: 除法實現類
 * User: lwx
 * Date: 2019-03-09
 * Time: 20:51
 */
public class OperationDiv extends Operation {

    double getResult() {
        if (numberB == 0){
            throw new ArithmeticException("除數不能爲0");
        }
        return numberA / numberB;
    }

}

    接着建立運算工廠類,根據運算符去建立對應的實現類。對象

package com.lwx.factory;

/**
 * Created with IntelliJ IDEA.
 * Description: 運算工廠類
 * User: lwx
 * Date: 2019-03-09
 * Time: 21:06
 */
public class OperationFactory {

    public static Operation createOperation(String operate) {
        Operation operation = null;
        switch (operate) {
            case "+":
                operation = new OperationAdd();
                break;
            case "-":
                operation = new OperationSub();
                break;
            case "*":
                operation = new OperationMul();
                break;
            case "/":
                operation = new OperationDiv();
                break;
        }
        return operation;
    }

}

   最後是測試類和測試結果。blog

package com.lwx.factory;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lwx
 * Date: 2019-03-09
 * Time: 20:59
 */
public class OperationTest {

    public static void main(String[] args) {
        Operation operation = OperationFactory.createOperation("+");
        operation.numberA = 5;
        operation.numberB = 10;
        System.out.println(operation.getResult());
    }

}

    以上就是簡單工廠的示例代碼,只須要傳入運算符號工廠類就能夠自動返回對應的計算實現類。     接口

    接下來把上面的計算器改爲工廠方法模式。ip

    老規矩先看下結構圖。

    在上面代碼的基礎上加入工廠接口類以及具體實現類,上面的運算工廠類就不用了。

    先建立一個工廠接口。

package com.lwx.factory;

/**
 * Created with IntelliJ IDEA.
 * Description: 工廠接口
 * User: lwx
 * Date: 2019-03-09
 * Time: 21:15
 */
public interface Factory {

    Operation createOperation();

}

    而後是四種運算的具體實現工廠類。

package com.lwx.factory;

/**
 * Created with IntelliJ IDEA.
 * Description: 加法類工廠
 * User: lwx
 * Date: 2019-03-09
 * Time: 21:16
 */
public class AddFactory implements Factory {

    @Override
    public Operation createOperation() {
        return new OperationAdd();
    }

}

 

package com.lwx.factory;

/**
 * Created with IntelliJ IDEA.
 * Description: 減法工廠類
 * User: lwx
 * Date: 2019-03-09
 * Time: 21:17
 */
public class SubFactory implements Factory {

    @Override
    public Operation createOperation() {
        return new OperationSub();
    }

}

 

package com.lwx.factory;

/**
 * Created with IntelliJ IDEA.
 * Description: 乘法工廠類
 * User: lwx
 * Date: 2019-03-09
 * Time: 21:18
 */
public class MulFactory implements Factory {

    @Override
    public Operation createOperation() {
        return new OperationMul();
    }

}

 

package com.lwx.factory;

/**
 * Created with IntelliJ IDEA.
 * Description: 除法工廠類
 * User: lwx
 * Date: 2019-03-09
 * Time: 21:19
 */
public class DivFactory implements Factory {

    @Override
    public Operation createOperation() {
        return new OperationDiv();
    }

}

    最後看下工廠方法模式的測試類和運行結果。

package com.lwx.factory;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lwx
 * Date: 2019-03-09
 * Time: 21:58
 */
public class FactoryTest {

    public static void main(String[] args) {
        Factory factory = new DivFactory();
        Operation operation = factory.createOperation();
        operation.numberA = 8;
        operation.numberB = 10;
        System.out.println(operation.getResult());
    }
    
}

     簡單工廠模式的優缺點:

     優勢:

      1.簡單工廠包含必要的邏輯判斷,簡單工廠實現了對象的建立和使用的分離。

      2.客戶端無需知道所建立的集體產品類的類名,只須要知道具體產品類對應的參數便可。

      3.在不修改客戶端代碼的狀況下更換和增長新的具體產品類,在必定程度上提升了系統的靈活性。

    缺點:

      1.工廠類職責太重,從代碼中能夠看出簡單工廠包含加減乘除的邏輯判斷語句,它一旦有問題,整個系統都要出問題。

      2.再添加新類的時候,簡單工廠類就要修改,違反了開放———封閉原則,這樣不利於系統的擴展和維護。

    因此出現了工廠方法,工廠方法是簡單工廠的進一步延伸,完美解決了開放——封閉原則的問題。  

    工廠方法模式的優缺點:

    優勢:

      1.工廠方法用來建立客戶所需的產品,同時隱藏了哪一種具體產品類被實例化的細節,用戶只須要關注工廠,不須要關注建立的細節。

      2.在增長新的運算類時不用修改代碼,只須要增長對應的工廠就好,徹底符合開放——封閉原則。

    缺點:

      1.在增長新的產品時,也必須增長新的工廠類,會帶來額外的開銷。

 

    倆個工廠各有利弊,簡單工廠違反了最基本的原則,工廠方法完美解決了簡單工廠的弊端,可是工廠方法的工廠個數過多,致使系統龐大。

    

    最後附上demo的githup地址:https://github.com/yijinqincai/design_patterns

 

    做者: 一金芹菜
    出處: https://www.cnblogs.com/yijinqincai/
    本文版權歸做者,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。
相關文章
相關標籤/搜索