show me the code and take to me,作的出來更要說的明白
GitHub項目JavaHouse同步收錄
喜歡就點個讚唄! 你的支持是我分享的動力!java
咱們常常聽到工廠模式,好比說 Spring 用了工廠模式啦,面試也會被問到工廠模式等等,這見工廠模式是平常開發中比較重要的一種設計模式。其實工廠模式也是比較簡單的一種設計模式,這年頭彷佛不瞭解工廠模式,你都很差意思說你學過 編程同樣(手動狗頭)。那麼,容許我靈魂拷問一下,你真的瞭解工廠模式嗎。git
不急,咱們先看看 UML 類圖。學習一下怎麼用 UML 類圖 表示代碼。先看如何表示一個實體類。代碼以下:github
public class B { private String name; private String password; public void test(){ } }
這是一個簡單的實體類。他的 看 UML 類圖以下:面試
看完實體類,咱們在來看看接口,代碼以下:編程
public interface B { void test(); }
這是一個簡單的接類。通常接口就放幾個方法,不放屬性。他的 看 UML 類圖以下:設計模式
看完實體類和接口,咱們來看看他們有什麼關係吧。先看看繼承關係如何表示:微信
能夠一眼看到他的箭頭特色---空心的。箭頭指向父類。這就是繼承關係表示。ide
看完繼承關係,咱們在看看實現接口如何表示。post
這裏咱們能夠看到與繼承關係相似,不過實現變成虛線,箭頭指向接口類。學習
完了沒有,沒有,咱們在看看依賴關係,這種關係比較弱,通常是一個類做爲另外一個類的參數表示, uml 圖以下:
依賴關係是虛線,半個箭頭
到這裏,以上就是常見的 uml 類圖表示。
進入正題,什麼是工廠模式,咱們先看看簡單工廠模式,其實簡單工廠模式並非工廠模式,可是他能夠幫助咱們去了解工廠模式,因此咱們先看看簡單工廠模式。
需求:咱們須要作一個能夠加減乘除的計算機,運用到簡單工廠模式。
UML 類圖:
運算類:
import lombok.Data; @Data public abstract class Operation { private Double numA; private Double numB; /** * 運算方法 */ abstract Double getResult(); }
加法類:
public class OperationAdd extends Operation{ @Override Double getResult() { return getNumA() + getNumB(); } }
乘法類:
public class OperationMul extends Operation{ @Override Double getResult() { return getNumA() * getNumB(); } }
除法類:
public class OperationDiv extends Operation{ @Override Double getResult() { if (getNumB() == 0){ throw new RuntimeException("除數不能爲零!"); } return getNumA() / getNumB(); } }
簡單工廠類:
public class CreateOperationFactory { public static Operation createOperation(String operate){ Operation operation = null; switch (operate){ case "+": operation = new OperationAdd(); System.out.println("這是+法"); break; case "/": operation = new OperationDiv(); System.out.println("這是/法"); break; case "*": operation = new OperationMul(); System.out.println("這是*法"); break; } return operation; } }
測試類:
public class Test { public static void main(String[] args) { Operation operation = CreateOperationFactory.createOperation("+"); operation.setNumA(1D); operation.setNumB(2D); System.out.println(operation.getResult()); operation = CreateOperationFactory.createOperation("*"); operation.setNumA(1D); operation.setNumB(2D); System.out.println(operation.getResult()); operation = CreateOperationFactory.createOperation("/"); operation.setNumA(1D); operation.setNumB(2D); System.out.println(operation.getResult()); } }
輸出接口:
這是+法 3.0 這是*法 2.0 這是/法 0.5
需求:要再添加一個減法運算,嗯?上面沒有減法運算嗎?我猜大家確定沒有發現上面沒有減法運算。看到的也會覺得我在偷懶了,矇混過關呢。事情並無這麼簡單。
通常來講,加個減法嘛,簡單,我直接就下 工廠類裏面加一個分支不就完事了。哈哈,卻不知,這時候,咱們已經違反一個重要的原則--開放關閉原則。所謂開放關閉原則,咱們不該該修源碼,祖傳代碼你敢動,試試看,而是經過繼承父類或者實現接口去拓展代碼,達到咱們的目的。
uml 類圖:
代碼以下:
public interface IFactory { Operation createOperation(String operate); } public class OperationAddFactory implements IFactory{ @Override public Operation createOperation(String operate) { Operation operation = new OperationAdd(); System.out.println("這是+法"); return operation; } }
沒錯,這裏是本身槓本身的環節。
什麼工廠模式啊!我本身 new
一個對應的對象不就解決問題了,爲啥要寫一個工廠類出來。(槓上槓啊,這是要搞事情)
嗯?好像我沒法反駁·····是不存在的(用我第三根手指推一推個人眼鏡)。試想一下,一個地方用到就去 new
一下。咱們一下new
了十幾個地方,而後發現要來類名,這時候,怎麼辦。一處一處改咯,本身new
的對象,哭着也要改完。可是若是用工廠類的話,咱們只須要改一個地方就能夠,就是這麼簡單。
就這一個優勢嗎?我仍是喜歡一個一個new
啊。
確定不是(這是一個槓精啊),固然簡單一個new
對象,確實不須要寫一個類出來。可是new
一個對象並非那麼簡單,咱們須要對象進行一個操做呢。Spring IOC機制默認建立對象是單例的,那麼咱們如今也須要對象是惟一的怎麼辦。這時候,咱們就是能夠在工廠類裏面寫一個單例模式,達到咱們的目的。
以上就是個人擡槓環節。
無論什麼設計模式,其實就是爲了代碼複用,少寫代碼,咱們作明白什麼模式是什麼模式,更要理解這些的做用。正所謂,武術的目的是爲了生髮,戰爭的出發點是爲了和平。總之,就是知其然知其因此然。
看到這裏的都是人才。
https://juejin.im/post/5d318b485188255957377ac3#heading-4
《大話設計模式》
https://www.zhihu.com/question/24843188 -- 工廠設計模式有什麼用?