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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

最简单java设计模式:工厂方法模式

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

前言

在前一篇文章講解了一下簡單工廠模式,在上篇文章中,我們也講到了簡單工廠模式的缺點(diǎn),就是不滿足開閉原則,這對于軟件的設(shè)計(jì)來說,是不太好的,而下面講解的工廠方法模式,正是為了彌補(bǔ)簡單工廠模式的缺點(diǎn),也可以說是簡單工廠模式的改進(jìn)版。

一、什么是工廠方法模式

工廠方法模式同樣屬于類的創(chuàng)建型模式又被稱為多態(tài)工廠模式 。工廠方法模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類當(dāng)中。核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)建,這樣核心類成為一個(gè)抽象工廠角色,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口,這樣進(jìn)一步抽象化的好處是使得工廠方法模式可以使系
統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。

二、工廠方法模式的角色和職責(zé)

1.抽象工廠(Creator)角色工廠方法模式的核心,任何工廠類都必須實(shí)現(xiàn)這個(gè)接口。

2.具體工廠( Concrete Creator)角色具體工廠類是抽象工廠的一個(gè)實(shí)現(xiàn),負(fù)責(zé)實(shí)例化產(chǎn)品對象。

3.抽象(Product)角色工廠方法模式所創(chuàng)建的所有對象的父類,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。

4.具體產(chǎn)品(Concrete Product)角色工廠方法模式所創(chuàng)建的具體實(shí)例對象

三、工廠方法模式的UML圖

  • sports:抽象角色

  • Basketball和Football:具體產(chǎn)品角色

  • sportsFactory:抽象工廠角色

  • BasketballFactory和FootballFactory:具體工廠角色

四、工廠方法模式代碼

這個(gè)例子和簡單工廠方法模式一樣,用運(yùn)動(dòng)作為抽象角色,足球和籃球作為具體的產(chǎn)品角色來講解,下面看具體代碼。

首先我們創(chuàng)建一個(gè)抽象類sports,同時(shí)有一個(gè)運(yùn)動(dòng)的方法

public interface Sports {/** 運(yùn)動(dòng)*/public void play(); }

然后,定義了一個(gè)足球類籃球類,同樣有運(yùn)動(dòng)方法

public class Basketball implements Sports{/** 運(yùn)動(dòng)*/public void play(){System.out.println("打籃球...");} } public class Football implements Sports{/** 運(yùn)動(dòng)*/public void play(){System.out.println("踢足球啦...");} }

最后寫一個(gè)工廠類,用來創(chuàng)造足球運(yùn)動(dòng)籃球運(yùn)動(dòng)。

下面我們來更改簡單工廠模式的代碼,逐步的改為工廠方法模式。

4.1、抽象工廠接口

public interface SportsFactory {/** get方法,獲得所有產(chǎn)品對象*/public Sports getSports();}

這里和簡單工廠模式不同,我們先需要一個(gè)抽象工廠接口,然后將具體的工廠實(shí)現(xiàn)到具體的子類中,這樣就能夠符合開閉原則

4.2、籃球具體工廠

public class BasketballFactory implements SportsFactory{@Overridepublic Sports getSports() {return new Basketball();}}

4.3、足球具體工廠

public class FootballFactory implements SportsFactory {@Overridepublic Sports getSports() {return new Football();}}

這樣就將具體的不同產(chǎn)品的實(shí)現(xiàn),放到了具體的工廠來實(shí)現(xiàn),當(dāng)我們再增加其他的具體的產(chǎn)品時(shí),只需要再增加一個(gè)具體的產(chǎn)品的工廠類,而不需要去改變原有的代碼,所以符合對擴(kuò)展開放的思想。

五、測試

public class MainClass {public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {//創(chuàng)建籃球工廠SportsFactory basketballFactory = new BasketballFactory();Sports basketball = basketballFactory.getSports();basketball.play();//創(chuàng)建足球工廠SportsFactory footballFactory = new FootballFactory();Sports football = footballFactory.getSports();football.play();} }

運(yùn)行結(jié)果:

六、工廠方法模式的優(yōu)缺點(diǎn)

工廠方法模式的優(yōu)點(diǎn)

在工廠方法模式中,工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時(shí)還向客戶隱藏了哪種具體產(chǎn)品類將被實(shí)例化這一細(xì)節(jié),用戶只需要關(guān)心所需產(chǎn)品對應(yīng)的工廠,無須關(guān)心創(chuàng)建細(xì)節(jié),甚至無須知道具體產(chǎn)品類的類名。

基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。它能夠使工廠可以自主確定創(chuàng)建何種產(chǎn)品對象,而如何創(chuàng)建這個(gè)對象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類都具有同一抽象父類。

使用工廠方法模式的另一個(gè)優(yōu)點(diǎn)是在系統(tǒng)中加入新產(chǎn)品時(shí),無須修改抽象工廠和抽象產(chǎn)品提供的接口,無須修改客戶端,也無須修改其他的具體工廠和具體產(chǎn)品,而只要添加一個(gè)具體工廠和具體產(chǎn)品就可以了。這樣,系統(tǒng)的可擴(kuò)展性也就變得非常好,完全符合“開閉原則”。

工廠方法模式的缺點(diǎn)

在添加新產(chǎn)品時(shí),需要編寫新的具體產(chǎn)品類,而且還要提供與之對應(yīng)的具體工廠類,系統(tǒng)中類的個(gè)數(shù)將成對增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,有更多的類需要編譯和運(yùn)行,會(huì)給系統(tǒng)帶來一些額外的開銷。

由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度,且在實(shí)現(xiàn)時(shí)可能需要用到DOM、反射等技術(shù),增加了系統(tǒng)的實(shí)現(xiàn)難度。

七、適用場景

一個(gè)類不知道它所需要的對象的類:在工廠方法模式中,客戶端不需要知道具體產(chǎn)品類的類名,只需要知道所對應(yīng)的工廠即可,具體的產(chǎn)品對象由具體工廠類創(chuàng)建;客戶端需要知道創(chuàng)建具體產(chǎn)品的工廠類。

一個(gè)類通過其子類來指定創(chuàng)建哪個(gè)對象:在工廠方法模式中,對于抽象工廠類只需要提供一個(gè)創(chuàng)建產(chǎn)品的接口,而由其子類來確定具體要?jiǎng)?chuàng)建的對象,利用面向?qū)ο蟮亩鄳B(tài)性和里氏代換原則,在程序運(yùn)行時(shí),子類對象將覆蓋父類對象,從而使得系統(tǒng)更容易擴(kuò)展。

將創(chuàng)建對象的任務(wù)委托給多個(gè)工廠子類中的某一個(gè),客戶端在使用時(shí)可以無須關(guān)心是哪一個(gè)工廠子類創(chuàng)建產(chǎn)品子類,需要時(shí)再動(dòng)態(tài)指定,可將具體工廠類的類名存儲(chǔ)在配置文件或數(shù)據(jù)庫中。

八、工廠方法模式和簡單工廠模式比較

工廠方法模式簡單工廠模式在結(jié)構(gòu)上的不同不是很明顯。工廠方法類的核心是一個(gè)抽象工廠類,而簡單工廠模式把核心放在一個(gè)具體類上。

工廠方法模式之所以有一個(gè)別名叫多態(tài)性工廠模式是因?yàn)榫唧w工廠類都有共同的接口,或者有共同的抽象父類。當(dāng)系統(tǒng)擴(kuò)展需要添加新的產(chǎn)品對象時(shí),僅僅需要添加一個(gè)具體對象以及一個(gè)具體工廠對象,原有工廠對象不需要進(jìn)行任何修改,也
不需要修改客戶端,很好的符合了“開放-封閉”原則。

簡單工廠模式在添加新產(chǎn)品對象后不得不修改工廠方法,擴(kuò)展性不好。

工廠方法模式退化后可以演變成簡單工廠模式。

總結(jié)

以上是生活随笔為你收集整理的最简单java设计模式:工厂方法模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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