电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

java 靜態(tài)工廠代替多參構(gòu)造器的適用情況與優(yōu)劣

瀏覽:3日期:2022-08-19 16:39:25
背景

假如現(xiàn)在你要想一個(gè)漢堡,有一個(gè)漢堡類(lèi):Hamburg。那么一般情況下你會(huì):

Hamburg hamburg = new Hamburg();情景一:不同參數(shù)數(shù)目的構(gòu)造器

制作漢堡可以選擇自定義,加肉,加菜,或者不添加,直接默認(rèn)配方即可,那么會(huì)有以下幾個(gè)構(gòu)造器:

Hamburg();Hamburg(Meat meat);Hamburg(Meat meat,Vegetable vegetable);

當(dāng)你要制作漢堡的時(shí)候,看到這么多的構(gòu)造器,但是卻不知道他們是什么意思,返回的漢堡到底有什么區(qū)別?查文檔又有點(diǎn)麻煩,有沒(méi)有更好的解決方法呢?

情景二:不同種類(lèi)的漢堡

如果有多種漢堡:新奧爾良漢堡,麥辣香漢堡。常規(guī)的做法就是:繼承漢堡類(lèi),實(shí)現(xiàn)子類(lèi),如:

class xinaoerliangHamburg extends Hamburg{}class mailaHamburg extends Hamburg{}

但是會(huì)有問(wèn)題:用戶(hù)在使用的時(shí)候,還得記住你那么多類(lèi)名,那是不是很麻煩?如果后續(xù)有更多的口味,那是不是要記住更多地類(lèi)去才能得到對(duì)應(yīng)的實(shí)例呢?有沒(méi)有更好的解決方法?

情景三:自定義漢堡的做法

如果漢堡的手法讓你非常不滿(mǎn)意,你想要用達(dá)芬奇技法來(lái)制作漢堡,那么可以怎么做呢?常規(guī)的做法是:

class Hamburg{ ... //默認(rèn)制作手法 private Maker mMaker = new DefaultMaker(); public Hamburg(Maker maker){ ... //使用傳進(jìn)來(lái)的手法對(duì)象制作漢堡 mMaker = maker; ... }}

需要重新寫(xiě)一個(gè)構(gòu)造器,傳入?yún)?shù)來(lái)覆蓋原來(lái)的制作手法。這樣既有情景一的問(wèn)題,還有另外的問(wèn)題是:如果需要自定義的東西多的時(shí)候,那么Hamburg里需要維護(hù)的代碼就更加的復(fù)雜了。

什么是靜態(tài)工廠方法

以上情景問(wèn)題可以通過(guò)靜態(tài)工廠方法來(lái)改善。

注意,這里的靜態(tài)工廠方法并不是設(shè)計(jì)模式中的工廠模式。這里只是使用靜態(tài)工廠方法來(lái)代替構(gòu)造器實(shí)例化對(duì)象。

顧名思義,靜態(tài)工廠方法,就是使用靜態(tài)方法來(lái)構(gòu)建類(lèi)的實(shí)例,解決使用構(gòu)造器實(shí)例化的各種問(wèn)題。先看個(gè)例子,還是以上面的漢堡為例子,如果需要多種口味的漢堡,那么可以:

class Hamburg{ //獲取奧爾良口味的漢堡 public static Hamburg ofAoErLiang(){ return new AoErLiangHamburg(); } //獲取麥辣香味的漢堡 public static Hamburg ofMaiLaXiang(){ return new MaiLaXiangHamburg(); }}//兩種口味的漢堡,通過(guò)繼承漢堡實(shí)現(xiàn)class AoErLiangHamburg extends Hamburg{}class MaiLaXiangHamburg extends Hamburg{}

通過(guò)這種方法可以解決的是:用戶(hù)需要什么類(lèi)型的漢堡,可以直接通過(guò)Hamburg的靜態(tài)方法來(lái)獲取,而無(wú)需知道他的子類(lèi)名字是什么。而如果有更多種口味的漢堡,只需要擴(kuò)展靜態(tài)方法即可;或者給靜態(tài)方法增加參數(shù),通過(guò)switch來(lái)返回對(duì)應(yīng)的口味漢堡。

靜態(tài)工廠優(yōu)缺點(diǎn)

這里的話(huà)會(huì)結(jié)合上面舉的例子,如果忘記了,看到可以返回去看一下。

優(yōu)點(diǎn) 解決構(gòu)造器重載卻不知道各種構(gòu)造器含義的問(wèn)題。通過(guò)構(gòu)造方法可以在方法名寫(xiě)明,那么用戶(hù)只需要通過(guò)方法名就知道這個(gè)方法是返回什么對(duì)象。(例如情景一)例如:

//不同的靜態(tài)工廠方法返回不同的實(shí)例,通過(guò)方法名就知道他們的區(qū)別//ps:這是android的動(dòng)畫(huà)類(lèi)ObjectAnimator animator = ObjectAnimator.ofFloat();ObjectAnimator animator = ObjectAnimator.ofInt(); 可以通過(guò)根據(jù)用戶(hù)的參數(shù)或者調(diào)用不同的靜態(tài)工廠方法來(lái)返回具體的子類(lèi)對(duì)象。當(dāng)后期要更換方法接口返回的子類(lèi)時(shí),對(duì)于用戶(hù)來(lái)說(shuō)也是透明的,用戶(hù)只是拿到一個(gè)父類(lèi)引用的對(duì)象。可以參考上面我在介紹靜態(tài)工廠方法舉的例子。

Java 8以上,可以在接口中定義靜態(tài)工廠方法,這樣無(wú)需知道該接口有多少個(gè)實(shí)現(xiàn)類(lèi),只需要根據(jù)靜態(tài)方法來(lái)獲取接口對(duì)象即可。

重復(fù)利用對(duì)象,防止創(chuàng)建無(wú)用實(shí)例。這看起來(lái)很像單例,但是比單例要靈活得多。可以根據(jù)具體的情況,來(lái)判斷是否要緩存實(shí)例。 可以動(dòng)態(tài)注冊(cè)代碼。我們可以通過(guò)一組用戶(hù)注冊(cè)api,讓用戶(hù)先把需要的自定義代碼注入,再調(diào)用靜態(tài)方法來(lái)獲取自己需要的對(duì)象類(lèi)型。這樣的好處就是不會(huì)有一堆很復(fù)雜的構(gòu)造器,內(nèi)部邏輯也可以分離。對(duì)應(yīng)情景三解決的問(wèn)題缺點(diǎn) 如果該類(lèi)不包含public或者protect構(gòu)造器,那么將無(wú)法被子類(lèi)實(shí)例化。因?yàn)槲覀兿胍脩?hù)通過(guò)靜態(tài)方法來(lái)獲取對(duì)象,而不喜歡用戶(hù)通過(guò)構(gòu)造方法來(lái)實(shí)例化對(duì)象。而如果把構(gòu)造器設(shè)置為private,則無(wú)法被子類(lèi)繼承。 無(wú)法在javadoc中直接查看文檔介紹,構(gòu)造器是會(huì)直接生成doc的。但是直接通過(guò)方法名和參數(shù)名,已經(jīng)可以看懂很多了。 靜態(tài)方法命名規(guī)范 方法名 含義 fromXxx 類(lèi)型轉(zhuǎn)換 ofXxx 多個(gè)參數(shù)聚合 valueOf 和from of類(lèi)似 getInstance 獲取一個(gè)實(shí)例,實(shí)例類(lèi)型通過(guò)方法參數(shù)描述 getNewInstance/create 獲取一個(gè)新的實(shí)例 getType 主要用于工廠方法中獲取不同類(lèi)的對(duì)象(屬于設(shè)計(jì)模式中的工廠方法) newType 新建一個(gè)對(duì)應(yīng)類(lèi)的對(duì)象(屬于設(shè)計(jì)模式中的工廠方法) type 上面兩者的簡(jiǎn)化版 小結(jié)

在有多種子類(lèi)或者重載構(gòu)造器的時(shí)候,可以?xún)?yōu)先考慮一下靜態(tài)工廠方法,可以讓我們的代碼更加地優(yōu)雅,也方便我們進(jìn)行維護(hù)。另外這和設(shè)計(jì)模式中的工廠模式有區(qū)別,并不是一樣的,要進(jìn)行區(qū)分。

參考資料

《effective java》

以上就是java 靜態(tài)工廠代替多參構(gòu)造器的詳細(xì)內(nèi)容,更多關(guān)于java 靜態(tài)工廠的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 蓄电池回收,ups电池后备电源回收,铅酸蓄电池回收,机房电源回收-广州益夫铅酸电池回收公司 | 广域铭岛Geega(际嘉)工业互联网平台-以数字科技引领行业跃迁 | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 佛山商标注册_商标注册代理|专利注册申请_商标注册公司_鸿邦知识产权 | 刮板输送机,粉尘加湿搅拌机,螺旋输送机,布袋除尘器 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 煤粉取样器-射油器-便携式等速飞灰取样器-连灵动 | 北京三友信电子科技有限公司-ETC高速自动栏杆机|ETC机柜|激光车辆轮廓测量仪|嵌入式车道控制器 | 液氨泵,液化气泵-淄博「亚泰」燃气设备制造有限公司 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 运动木地板厂家_体育木地板安装_篮球木地板选购_实木运动地板价格 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) | 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 | 合肥宠物店装修_合肥宠物美容院装修_合肥宠物医院设计装修公司-安徽盛世和居装饰 | 电缆接头_防水接头_电缆防水接头_防水电缆接头_上海闵彬 | 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | 开云(中国)Kaiyun·官方网站-登录入口 | 嘉兴恒升声级计-湖南衡仪声级计-杭州爱华多功能声级计-上海邦沃仪器设备有限公司 | 螺纹三通快插接头-弯通快插接头-宁波舜驰气动科技有限公司 | 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 行吊_电动单梁起重机_双梁起重机_合肥起重机_厂家_合肥市神雕起重机械有限公司 | 搜活动房网—活动房_集装箱活动房_集成房屋_活动房屋 | 番茄畅听邀请码怎么输入 - Dianw8.com | 电机保护器-电动机综合保护器-浙江开民| UV固化机_UVLED光固化机_UV干燥机生产厂家-上海冠顶公司专业生产UV固化机设备 | 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | IP检测-检测您的IP质量 | 照相馆预约系统,微信公众号摄影门店系统,影楼管理软件-盟百网络 | 深圳市超时尚职业培训学校,培训:月嫂,育婴,养老,家政;化妆,美容,美发,美甲. | 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | 股指期货-期货开户-交易手续费佣金加1分-保证金低-期货公司排名靠前-万利信息开户 | 变色龙PPT-国内原创PPT模板交易平台 - PPT贰零 - 西安聚讯网络科技有限公司 | 高低温万能试验机_拉力试验机_拉伸试验机-馥勒仪器科技(上海)有限公司 | 玻璃钢罐_玻璃钢储罐_盐酸罐厂家-河北华盛节能设备有限公司 | 淘剧影院_海量最新电视剧,免费高清电影随心观看 | 网站seo优化_seo云优化_搜索引擎seo_启新网络服务中心 | 台湾Apex减速机_APEX行星减速机_台湾精锐减速机厂家代理【现货】-杭州摩森机电 | 合肥展厅设计-安徽展台设计-合肥展览公司-安徽奥美展览工程有限公司 | 深圳市人通智能科技有限公司| 九爱图纸|机械CAD图纸下载交流中心 |