Java實現(xiàn)簡單工廠模式—GoF(一)

前言

開始設(shè)計模式之初,要多說兩句。

今天工作整整兩年!長時間的基礎(chǔ)編程,使我代碼掌握的很熟練,通過前輩們的推薦以及眾多前輩的博文,在未來的兩年里,我給我自己總結(jié)了一份學習路徑,就以書的形式推進下去。

  1. 《大話設(shè)計模式》或《研磨設(shè)計模式》
  2. 《重構(gòu) 改善既有代碼的設(shè)計》
  3. 《effective java》
  4. 《深入理解Java虛擬機》
  5. 《Java并發(fā)編程實戰(zhàn)》
  6. 《深入理解計算機系統(tǒng)》

除此之外,閑暇之余多閱讀一下JDK源碼,了解其原理,以及JDK中工具的使用(JDK中的工具類,大多都是優(yōu)化過的,比自己寫的強多了)。

之前開發(fā)經(jīng)驗尚淺,只能寫一些自己平常用到的環(huán)境安裝、自己解決的問題、自己日常的學習記錄。

大話設(shè)計模式之前也讀過一兩遍,由于沒有什么經(jīng)驗,也是一知半解,趁著這個有意義的時間節(jié)點,開始學習一些深入的知識,現(xiàn)在就從最初的開始。

為什么要學習設(shè)計模式?

  1. 在軟件開發(fā)領(lǐng)域,經(jīng)過驗證的,用于解決在特定環(huán)境下,重復出現(xiàn)的特定問題的解決方案! ——引用自《研磨設(shè)計模式》
  2. 學習設(shè)計模式是個人技術(shù)能力的提高的捷徑
  3. 不用重復發(fā)明輪子

為什么要寫博文?

雖然寫的博文大多都 差強人意,但為什么還是要寫呢?

于自己,博文是自己的總結(jié),學進的東西,能講出來才是最好的學。

于讀者,通過我寫的博文,能獲取到知識點,那這篇博文就有存在的意義。

簡單工廠模式

(1) 一個實現(xiàn)一個計算器

簡單工廠模式比較簡單,直接就引用《大話數(shù)據(jù)模式》中的示例。

示例中含有:

  • OperationFactory 工廠
  • Operation 操作類基類
  • OperationAdd 加法操作
  • OperationSub 減法操作
  • OperationMul 乘法操作
  • OperationDiv 除法操作

下面來看具體實現(xiàn):

1)操作類

/**
 * 操作基類
 */
class Operation {
    double numA;
    double numB;

    double getResult() {
        return 0;
    }
}

/**
 * +
 */
class OperationAdd extends Operation {

    @Override
    public double getResult() {
        return numA + numB;
    }
}

/**
 * -
 */
class OperationSub extends Operation {

    @Override
    public double getResult() {
        return numA - numB;
    }
}

/**
 * *
 */
class OperationMul extends Operation {

    @Override
    public double getResult() {
        return numA * numB;
    }
}

/**
 * /
 */
class OperationDiv extends Operation {

    @Override
    public double getResult() {
        return numA / numB;
    }
}

2)工廠類

/**
 * 實現(xiàn)一個擁有 + - * / 功能的簡單計算器
 *
 * @from 大話設(shè)計模式
 */
class OperationFactory {
    /**
     * 生產(chǎn)計算
     *
     * @param operate 操作符號
     * @return 產(chǎn)出操作
     */
    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();
        }
        return operation;
    }
}

2)測試

public class SimpleFactoryDemo {
    public static void main(String[] args) {
        /*操作工廠產(chǎn)出 + 的操作,后面賦值獲取結(jié)果*/
        Operation operation = OperationFactory.createOperation("+");
        operation.numA = 1;
        operation.numB = 1;
        System.out.println(operation.numA + "+" + operation.numB + "=" + operation.getResult());
        /*操作工廠產(chǎn)出 * 的操作,后面賦值獲取結(jié)果*/
        Operation operationMul = OperationFactory.createOperation("*");
        operationMul.numA = 2;
        operationMul.numB = 3;
        System.out.println(operationMul.numA + "+" + operationMul.numB + "=" + operationMul.getResult());
    }
}

這里會輸出結(jié)果

1.0+1.0=2.0
2.0+3.0=6.0

一個簡單工廠模式就這樣實現(xiàn)了。

具體使用還要結(jié)合實際業(yè)務進行不同程度的修改,給大家介紹一個比較實際的業(yè)務。

(2) 另一個實際使用的業(yè)務

拋開業(yè)務講實現(xiàn)方案都是刷流氓

價格數(shù)據(jù)計算問題,這里就不展示代碼了。

大概業(yè)務就是:計算商品價格的同比、環(huán)比、累計比等結(jié)果(每天午間新聞都會講的那種價格數(shù)據(jù))。某一系列的價格數(shù)據(jù)構(gòu)成一個數(shù)組,這個數(shù)組數(shù)據(jù)可以計算為同比、環(huán)比等。

計算這些價格數(shù)據(jù),它有不同的公式,也就是說輸入的數(shù)據(jù)是一樣的,但是計算公式相同產(chǎn)生的結(jié)果不同。

為了保證公式的可擴展性,我就使用了簡單工廠模式處理這個公式計算問題。

  • CalculateFactory 計算公式工廠類(類名虛構(gòu))
  • IFormulaOperation 計算公式操作接口,這里用接口而不是父類,是因為接口更加靈活,也用到了JDK1.8中的新特性(default 方法等)。
  • FormulaA 拉式公式(類名虛構(gòu))
  • FormulaB 派式公示(類名虛構(gòu))
  • .......

代碼實現(xiàn)思路與上面的計算器的實現(xiàn)是相差不大的,就是代碼復雜了很多,當了解這個工廠模式了,就很容易看的懂代碼了,而且同事之前討論也比較方便。

最后,有一句話想說,即使有聰明的人一兩遍就理解并使用了很多設(shè)計模式,但是在這里還是建議大家有空多回顧回顧,就我自己而言,每次看設(shè)計模式,都有不一樣的想法和思路,還有可能對以前業(yè)務有更新奇的解決方案。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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