最简单java设计模式:抽象工厂模式
前言
在前一篇文章講解了一下簡單工廠模式和工廠方法模式,這篇文章再把抽象工廠模式講解一下。
一、什么是抽象工廠模式
抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最其一般性的。抽象工廠模式可以向客戶端提供一個(gè)接口,使得客戶端在不必指定產(chǎn)品的具體類型的情況下,能夠創(chuàng)建多個(gè)產(chǎn)品族的產(chǎn)品對象。
二、工廠方法模式的角色和職責(zé)
1.抽象工廠(Creator)角色抽象工廠模式的核心,包含對多個(gè)產(chǎn)品結(jié)構(gòu)的聲明,任何工廠類都必須實(shí)現(xiàn)這個(gè)接口。
2.具體工廠( Concrete Creator)角色具體工廠類是抽象工廠的一個(gè)實(shí)現(xiàn),負(fù)責(zé)實(shí)例化某個(gè)產(chǎn)品族中的產(chǎn)品對象。
3.抽象(Product)角色抽象模式所創(chuàng)建的所有對象的父類,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。
4.具體產(chǎn)品(Concrete Product)角色抽象模式所創(chuàng)建的具體實(shí)例對象
**總結(jié):**抽象工廠中方法對應(yīng)產(chǎn)品結(jié)構(gòu),具體工廠對應(yīng)產(chǎn)品族。
三、工廠方法模式的UML圖
四、抽象工廠模式代碼
這個(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è)足球類和籃球類,但是,這里需要注意,這兩個(gè)類都是抽象的類,讓這兩個(gè)類作為抽象類,再實(shí)例化出具體的產(chǎn)品,產(chǎn)生一系列的產(chǎn)品族。
public abstract class Football implements Sports{/** 運(yùn)動(dòng)*/public abstract void play(); } public abstract class Basketball implements Sports{public abstract void play();}然后,因?yàn)?strong>籃球分為男籃和女籃,足球分為男足和女足,因此,男性和女性就可以分為不同的產(chǎn)品族,這兩個(gè)產(chǎn)品族可以包括各種各樣的運(yùn)動(dòng)。
下面是男性運(yùn)動(dòng),分為一個(gè)產(chǎn)品族
public class ManBasketball extends Basketball{@Overridepublic void play() {System.out.println("男籃打籃球啦");}} public class ManFootball extends Football{@Overridepublic void play() {System.out.println("男足踢足球了...");}}女性運(yùn)動(dòng)分為一個(gè)產(chǎn)品族
public class WomanBasketball extends Basketball{@Overridepublic void play() {System.out.println("女籃打籃球啦...");}} public class WomanFootball extends Football{@Overridepublic void play() {System.out.println("女足踢足球了...");}}這樣我們就生成了兩個(gè)不同的產(chǎn)品族,男性運(yùn)動(dòng)和女性運(yùn)動(dòng)
下面我們編寫工廠接口。
4.1、抽象工廠接口
最頂層的這個(gè)方法是一個(gè)接口,里面應(yīng)該包括兩個(gè)方法,一個(gè)生成籃球?qū)ο?/strong>,一個(gè)生成足球?qū)ο?/strong>
public interface SportsFactory {/*** 實(shí)例化籃球* @return*/public Basketball getBasketball();/*** 實(shí)例化足球* @return*/public Football getFootball(); }然后,我們需要在抽象工廠的基礎(chǔ)上,劃分出產(chǎn)品族,分為男性運(yùn)動(dòng)工廠和女性運(yùn)動(dòng)工廠
4.2、男性運(yùn)動(dòng)具體工廠
生成男性運(yùn)動(dòng),包括男足和男籃的實(shí)例化。
public class ManSportsFactory implements SportsFactory{@Overridepublic Basketball getBasketball() {return new ManBasketball();}@Overridepublic Football getFootball() {return new ManFootball();}}4.3、女性運(yùn)動(dòng)具體工廠
生成女性運(yùn)動(dòng),包括女足和女籃的實(shí)例化。
public class WomanSportsFactory implements SportsFactory{@Overridepublic Basketball getBasketball() {return new WomanBasketball();}@Overridepublic Football getFootball() {return new WomanFootball();}}這樣就通過工廠產(chǎn)生了男性的產(chǎn)品族和女性產(chǎn)品族。
五、測試
public class MainClass {public static void main(String[] args) throws InstantiationException,IllegalAccessException, ClassNotFoundException {// 創(chuàng)建產(chǎn)品族工廠SportsFactory manSportsFactory = new ManSportsFactory();// 實(shí)例化具體對象Basketball basketball1 = manSportsFactory.getBasketball();Football football1 = manSportsFactory.getFootball();basketball1.play();football1.play();// 創(chuàng)建產(chǎn)品族工廠SportsFactory womanSportsFactory = new ManSportsFactory();// 實(shí)例化具體對象Basketball basketball2 = womanSportsFactory.getBasketball();Football football2 = womanSportsFactory.getFootball();basketball2.play();football2.play();} }運(yùn)行結(jié)果:
六、抽象工廠模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
針對同一組產(chǎn)品創(chuàng)建新的生產(chǎn)線,只需實(shí)現(xiàn)那組產(chǎn)品的抽象工廠接口即可創(chuàng)建新的工廠類。
缺點(diǎn)
抽象方法模式的最大缺點(diǎn)就是產(chǎn)品族本身的擴(kuò)展非常困難。如果在產(chǎn)品族中增加一個(gè)新的產(chǎn)品類型,則需要修改多個(gè)接口,并影響現(xiàn)已有的工廠類。
上面這句話,有些人不怎么理解,我給大家解釋一下,打個(gè)比方說,你要在這個(gè)工廠創(chuàng)建三個(gè)對象,原本只是創(chuàng)建兩個(gè)對象的,那么你就要在抽象方法中添加一個(gè)創(chuàng)建對象的方法,那么所有實(shí)現(xiàn)了這個(gè)接口的類都是要重新添加這個(gè)創(chuàng)建對象的方法,這就是對之前的工廠有影響的原因。
七、適用場景
當(dāng)一個(gè)對象都有相同的約束時(shí),可以使用抽象工廠模式。
打個(gè)比方說,這個(gè)工廠的幾個(gè)產(chǎn)品都需要經(jīng)過某些共同的步驟和打上相同的商標(biāo),這一組產(chǎn)品可以在一個(gè)工廠里面生產(chǎn),減少很多重復(fù)的代碼在不同的地方都出現(xiàn)多次。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的最简单java设计模式:抽象工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: http简介看这篇就够了
- 下一篇: java设计模式系列:单例模式