前言
開始設(shè)計模式之初,要多說兩句。
今天工作整整兩年!長時間的基礎(chǔ)編程,使我代碼掌握的很熟練,通過前輩們的推薦以及眾多前輩的博文,在未來的兩年里,我給我自己總結(jié)了一份學習路徑,就以書的形式推進下去。
- 《大話設(shè)計模式》或《研磨設(shè)計模式》
- 《重構(gòu) 改善既有代碼的設(shè)計》
- 《effective java》
- 《深入理解Java虛擬機》
- 《Java并發(fā)編程實戰(zhàn)》
- 《深入理解計算機系統(tǒng)》
除此之外,閑暇之余多閱讀一下JDK源碼,了解其原理,以及JDK中工具的使用(JDK中的工具類,大多都是優(yōu)化過的,比自己寫的強多了)。
之前開發(fā)經(jīng)驗尚淺,只能寫一些自己平常用到的環(huán)境安裝、自己解決的問題、自己日常的學習記錄。
大話設(shè)計模式之前也讀過一兩遍,由于沒有什么經(jīng)驗,也是一知半解,趁著這個有意義的時間節(jié)點,開始學習一些深入的知識,現(xiàn)在就從最初的開始。
為什么要學習設(shè)計模式?
- 在軟件開發(fā)領(lǐng)域,經(jīng)過驗證的,用于解決在特定環(huán)境下,重復出現(xiàn)的特定問題的解決方案! ——引用自《研磨設(shè)計模式》
- 學習設(shè)計模式是個人技術(shù)能力的提高的捷徑
- 不用重復發(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è)務有更新奇的解決方案。