轻松看懂java设计模式简单工厂模式
點擊上方“好好學(xué)java”,選擇“置頂公眾號”
優(yōu)秀學(xué)習(xí)資源、干貨第一時間送達(dá)!
?精彩內(nèi)容?
java實戰(zhàn)練習(xí)項目教程
2018微服務(wù)資源springboot、springcloud、docker、dubbo實戰(zhàn)等傾心分享
2018年java架構(gòu)師全套學(xué)習(xí)教程
最新大數(shù)據(jù)培訓(xùn)完整視頻教程
2018年java最新全套培訓(xùn)學(xué)習(xí)教程
一、什么是簡單工廠模式
簡單工廠模式屬于類的創(chuàng)建型模式,又叫做靜態(tài)工廠方法模式。通過專門定義一個類來負(fù)責(zé)創(chuàng)建其他類的實例,被創(chuàng)建的實例通常都具有共同的父類。
二、簡單工廠模式的角色和職責(zé)
1.工廠(Creator)角色簡單工廠模式的核心,它負(fù)責(zé)實現(xiàn)創(chuàng)建所有實例的內(nèi)部邏輯。工廠類可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對象。
2.抽象(Product)角色簡單工廠模式所創(chuàng)建的所有對象的父類,它負(fù)責(zé)描述所有實例所共有的公共接口。
3.具體產(chǎn)品(Concrete Product)角色簡單工廠模式所創(chuàng)建的具體實例對象
三、簡單工廠模式的UML圖
sports:抽象角色
Basketball和Football:具體產(chǎn)品角色
sportsFactory:工廠角色
四、簡單工廠模式代碼
這個例子,用運(yùn)動作為抽象角色,足球和籃球作為具體的產(chǎn)品角色來講解,下面看具體代碼。
首先我們創(chuàng)建一個抽象類sports,同時有一個運(yùn)動的方法
public?interface?Sports?{/**?運(yùn)動*/public?void?play(); }然后,定義了一個足球類和籃球類,同樣有運(yùn)動方法
public?class?Basketball?implements?Sports{/**?運(yùn)動*/public?void?play(){System.out.println("打籃球...");} } public?class?Football?implements?Sports{/**?運(yùn)動*/public?void?play(){System.out.println("踢足球啦...");} }最后寫一個工廠類,用來創(chuàng)造足球運(yùn)動和籃球運(yùn)動。
這里創(chuàng)建的方式有很多種方式,我們從簡單的開始,逐步優(yōu)化代碼。
4.1、單獨(dú)創(chuàng)建實例方法
public?class?SportsFactory?{/**?獲得Basketball類的實例public?static??Sports?getBasketball()?{return?new?Basketball();}/**?獲得Football類實例*/public?static?Sports?getFootball()?{return?new?Football();} }這種方法,直接用兩個不同的方法直接創(chuàng)建兩個實例對象。
4.2、邏輯判斷的方式
public?class?SportsFactory?{/**?getSports方法,獲得所有產(chǎn)品對象*/public?static?Sports?getSports(String?type)?throws?InstantiationException,?IllegalAccessException,?ClassNotFoundException?{if(type.equalsIgnoreCase("Basketball"))?{return?Basketball.class.newInstance();}?else?if(type.equalsIgnoreCase("Football"))?{return?Football.class.newInstance();}?else?{System.out.println("找不到相應(yīng)的實例化類");return?null;}} }先傳入一個類型參數(shù),然后判斷,再用反射的方式返回對象。
前面這兩種方式都不是最優(yōu)的方式,因為他們都違背了開閉原則。
開閉原則定義:一個軟件實體如類、模塊和函數(shù)應(yīng)該對擴(kuò)展開放,對修改關(guān)閉。
開放-封閉原則的意思就是說,你設(shè)計的時候,時刻要考慮,盡量讓這個類是足夠好,寫好了就不要去修改了,如果新需求來,我們增加一些類就完事了,原來的代碼能不動則不動。這個原則有兩個特性,一個是說“對于擴(kuò)展是開放的”,另一個是說“對于更改是封閉的”。面對需求,對程序的改動是通過增加新代碼進(jìn)行的,而不是更改現(xiàn)有的代碼。這就是“開放-封閉原則”的精神所在。
下面,我們再優(yōu)化一下。
4.3、反射實現(xiàn)方式
public?class?SportsFactory?{/**?getSports方法,獲得所有產(chǎn)品對象*/public?static?Sports?getSports(String?type)?throws?InstantiationException,?IllegalAccessException,?ClassNotFoundException?{Class?Sports?=?Class.forName(type);return?(Sports)?Sports.newInstance();} }這種方法,通過反射的方式實現(xiàn),不管我們還需要擴(kuò)展什么其他功能都不用再更改這個工廠類的代碼了,所以就符合開閉原則了。
五、測試
public?class?MainClass?{public?static?void?main(String[]?args)?throws?InstantiationException,?IllegalAccessException,?ClassNotFoundException?{//方法一測試 //????????//實例化一個Basketball //????????Basketball?Basketball?=?new?Basketball(); //????????//實例化一個Football //????????Football?Football?=?new?Football(); //???????? //????????Basketball.play(); //????????Football.play();//方法二測試 //????????//實例化一個Basketball,用到了多態(tài) //????????Sports?Basketball?=?new?Basketball(); //????????Sports?Football?=?new?Football(); //????????Basketball.play(); //????????Football.play();//????????//實例化一個Basketball //????????Sports?Basketball?=?SportsFactory.playBasketball(); //????????Sports?Football?=?SportsFactory.playFootball(); //????????Basketball.play(); //????????Football.play();//方法三測試Sports?Basketball?=?SportsFactory.getSports("Basketball");Sports?Football?=?SportsFactory.getSports("Football");Basketball.play();Football.play();} }運(yùn)行結(jié)果:
六、簡單工廠模式應(yīng)用場景
優(yōu)點:工廠類是整個模式的關(guān)鍵.包含了必要的邏輯判斷,根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個具體類的對象.通過使用工廠類,外界可以從直接創(chuàng)建具體產(chǎn)品對象的尷尬局面擺脫出來,僅僅需要負(fù)責(zé)“消費(fèi)”對象就可以了。而不必管這些對象究竟如何創(chuàng)建及如何組織的.明確了各自的職責(zé)和權(quán)利,有利于整個軟件體系結(jié)構(gòu)的優(yōu)化。
缺點:由于工廠類集中了所有實例的創(chuàng)建邏輯,違反了開閉原則,將全部創(chuàng)建邏輯集中到了一個工廠類中;它所能創(chuàng)建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時候,可能會出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)建不同實例的需求.這種對條件的判斷和對具體產(chǎn)品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統(tǒng)的維護(hù)和擴(kuò)展非常不利;
????覺得有用就轉(zhuǎn)發(fā)分享一下吧
推薦閱讀
1.?一文讀懂HttpServletRequest
2.?一文讀懂HttpServletResponse
3.?servlet就是這么簡單
4.?tomcat基本使用,就是這么簡單
附上熱門QQ群,存放資源和歷史資料,2000容量(低門檻付費(fèi)群),長按二維碼入群
總結(jié)
以上是生活随笔為你收集整理的轻松看懂java设计模式简单工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java后端开发每天遇到的jsp,了解一
- 下一篇: org.activiti.bpmn.ex