日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

轻松看懂java设计模式简单工厂模式

發(fā)布時間:2025/3/20 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 轻松看懂java设计模式简单工厂模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊上方“好好學(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。