這篇文章主要講解了“Java的抽象工廠模式是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java的抽象工廠模式是什么”吧!
成都創(chuàng)新互聯(lián)公司專注于鹿泉網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供鹿泉營銷型網(wǎng)站建設(shè),鹿泉網(wǎng)站制作、鹿泉網(wǎng)頁設(shè)計(jì)、鹿泉網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造鹿泉網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鹿泉網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
抽象工廠模式
抽象工廠模式(Abstract Factory Pattern)是圍繞一個(gè)超級(jí)工廠創(chuàng)建其他工廠。該超級(jí)工廠又稱為其他工廠的工廠。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
在抽象工廠模式中,接口是負(fù)責(zé)創(chuàng)建一個(gè)相關(guān)對(duì)象的工廠,不需要顯式指定它們的類。每個(gè)生成的工廠都能按照工廠模式提供對(duì)象。
舉個(gè)例子:還是用農(nóng)村人和城里人舉例吧,加深印象
首先,我是農(nóng)村人,我老爸老媽就是個(gè)果農(nóng)、菜農(nóng),種蘋果,梨,葡萄,包菜,菜花,辣椒等,農(nóng)村人自己種的水果蔬菜,肯定很香,無公害,城里面水果大多不敢吃,大部分都是有錢人承包的果園菜園打農(nóng)藥,催熟,膨大劑,美化粉,農(nóng)村人雖然窮,但是很地道,不坑人,你們城里人想吃我們家的水果、蔬菜怎么辦,你們也只能去水果店蔬菜店買,由于大城市和農(nóng)村距離產(chǎn)生了一個(gè)城市蔬菜水果批發(fā)大市場(chǎng)(超級(jí)工廠:里面什么東西都有,有水果,有蔬菜,有海鮮,肉類等等),水果店,蔬菜店(其他工廠)會(huì)在批發(fā)市場(chǎng)批發(fā)我們家的水果,蔬菜(前提有我們家的,緣分吧,應(yīng)該機(jī)會(huì)太小,題外話,其實(shí)農(nóng)民種的蔬菜水果,一般流入不到大城市的,有時(shí)候便宜的,就沒有商家來收的)
代碼實(shí)現(xiàn)
創(chuàng)建一個(gè)水果接口
/** * * @ClassName: Fruits * @Description: TODO(我們都是農(nóng)村的,自己種的水果,肯定很香,無公害,城里面水果不敢吃,大部分都是打農(nóng)藥,催熟,膨大劑,美化粉) * @author wangmeng * @date 2021年5月11日 */ public interface Fruits { // 諸葛家的水果地 public void buildFruits(); }
接口實(shí)現(xiàn)
蘋果地
public class Apple implements Fruits { @Override public void buildFruits() { System.out.println("農(nóng)村人套路少,老實(shí),種的蘋果很脆很甜,沒有化學(xué)物質(zhì),賣的還便宜,付出收獲不成正比"); } }
梨
public class Pear implements Fruits { @Override public void buildFruits() { System.out.println("農(nóng)村人套路少,老實(shí),自家地種的梨很脆很甜,沒有化學(xué)物質(zhì),而且還特便宜"); } }
創(chuàng)建一個(gè)蔬菜接口
/** * * @ClassName: Vegetables * @Description: TODO(蔬菜接口) * @author wangmeng * @date 2021年5月11日 */ public interface Vegetables { // 諸葛家的蔬菜地 public void buildVegetables(); }
蔬菜接口實(shí)現(xiàn)
包菜地
/** * * @ClassName: BaoCai * @Description: TODO(包菜地,主要生產(chǎn)包菜的) * @author 諸葛孔暗 * @date 2021年5月12日 */ public class BaoCai implements Vegetables { @Override public void buildVegetables() { System.out.println("農(nóng)村人種的包菜,地里面賣2毛錢一斤還送一斤,城里人買的包菜,2塊錢一斤還缺斤少兩,差價(jià)翻了10倍,還不是諸葛家種的,有可能是資本家種的轉(zhuǎn)基因包菜"); } }
菜花地
/** * * @ClassName: CaiHua * @Description: TODO(菜花地,主要生產(chǎn)菜花的) * @author 諸葛孔暗 * @date 2021年5月12日 */ public class CaiHua implements Vegetables { @Override public void buildVegetables() { System.out.println("農(nóng)村人種的菜花,地里面賣2毛錢一斤還送一斤,城里人買的菜花,2塊錢一斤還缺斤少兩,差價(jià)翻了10倍,還不是諸葛家種的,有可能是資本家種的轉(zhuǎn)基因菜花"); } }
為 Fruits(水果)和 Vegetables (蔬菜)對(duì)象創(chuàng)建抽象類來獲取工廠
/** * * @ClassName: AbstractFactory * @Description: TODO(為 Fruits(水果)和 Vegetables (蔬菜)對(duì)象創(chuàng)建抽象類來獲取工廠,功能相當(dāng)于大型批發(fā)市場(chǎng)了) * @author 諸葛孔暗 * @date 2021年5月12日 */ public abstract class AbstractFactory { public abstract Fruits getFruits(String appleType); public abstract Vegetables getVegetables(String vegeType) ; }
水果超市工廠
/** * * @ClassName: FruitsFactory * @Description: TODO(水果超市,水果工廠) * @author wangmeng * @date 2021年5月12日 */ public class FruitsFactory extends AbstractFactory { @Override public Fruits getFruits(String appleType) { if(appleType == null){ return null; } if(appleType.equalsIgnoreCase("Apple")){ return new Apple(); } else if(appleType.equalsIgnoreCase("Pear")){ return new Pear(); } return null; } /** * * @Title: getShape * @Description: TODO(生活小常識(shí):水果超市也有可能賣蔬菜:比如:妹子們都愛黃瓜,哈哈···,就去水果店就能買到,但它是蔬菜啊) * @param vegeType * @return * @see com.atxiaodei.factory.absfactory.AbstractFactory#getShape(java.lang.String) * @author wangmeng * @date 2021年5月12日 */ @Override public Vegetables getVegetables(String vegeType) { // return null; } }
蔬菜超市,工廠
/** * * @ClassName: VegetablesFactory * @Description: TODO(蔬菜超市,蔬菜工廠) * @author wangmeng * @date 2021年5月12日 */ public class VegetablesFactory extends AbstractFactory { @Override public Fruits getFruits(String appleType) { // TODO Auto-generated method stub return null; } @Override public Vegetables getVegetables(String vegeType) { if(vegeType == null){ return null; } if(vegeType.equalsIgnoreCase("Baocai")){ return new BaoCai(); } else if(vegeType.equalsIgnoreCase("CaiHua")){ return new CaiHua(); } return null; } }
創(chuàng)建大型批發(fā)市場(chǎng)大老板,生產(chǎn)水果和蔬菜(創(chuàng)建一個(gè)工廠創(chuàng)造器/生成器類,通過傳遞水果蔬菜類型信息來獲取工廠。)
/** * * @ClassName: FactoryProducer * @Description: TODO(創(chuàng)建大型批發(fā)市場(chǎng)大老板,生產(chǎn)水果和蔬菜(創(chuàng)建一個(gè)工廠創(chuàng)造器/生成器類,通過傳遞水果蔬菜類型信息來獲取工廠。)) * @author wangmeng * @date 2021年5月12日 */ public class FactoryProducer { public static AbstractFactory getFactory(String choice){ if(choice.equalsIgnoreCase("Fruits")){ return new FruitsFactory(); } else if(choice.equalsIgnoreCase("Vegetables")){ return new VegetablesFactory(); } return null; } }
測(cè)試
/** * * @ClassName: Test * @Description: TODO(實(shí)現(xiàn)過程都是通過類型獲取對(duì)象) * @author wangmeng * @date 2021年5月12日 */ public class Test { public static void main(String[] args) { // 農(nóng)民凌晨12點(diǎn)把水果運(yùn)到了批發(fā)市場(chǎng)(辛苦的農(nóng)民人,白天耕地,半夜賣菜的農(nóng)民人,可憐天下父母心) AbstractFactory fruitsFactory=FactoryProducer.getFactory("Fruits"); // 超市老板凌晨5點(diǎn)去批發(fā)市場(chǎng)批發(fā)了蘋果和梨(早起的創(chuàng)業(yè)人) Fruits apple=fruitsFactory.getFruits("Apple"); Fruits pear=fruitsFactory.getFruits("Pear"); // 太陽升起來了,城里人睡到了中午12點(diǎn)了,算了不吃飯了,去水果超市買兩個(gè)諸葛標(biāo)簽的蘋果和梨吃,無公害(懶惰,亞健康的我們) apple.buildFruits(); pear.buildFruits(); // 農(nóng)民凌晨12點(diǎn)把蔬菜運(yùn)到了批發(fā)市場(chǎng)(白天耕地,半夜賣菜的農(nóng)民人,可憐天下父母心) AbstractFactory vegetablesFactory = FactoryProducer.getFactory("Vegetables"); // 超市老板凌晨5點(diǎn)去批發(fā)市場(chǎng)批發(fā)了蘋果和梨(早起的創(chuàng)業(yè)人,比農(nóng)民聰明點(diǎn),早起早睡) Vegetables baocai = vegetablesFactory.getVegetables("Baocai"); Vegetables caihua = vegetablesFactory.getVegetables("caihua"); // 太陽升起來了,城里人睡到了中午12點(diǎn)了,算了不吃飯了,去蔬菜超市買兩個(gè)諸葛標(biāo)簽的包菜和菜花下午包餃子吃,無公害(懶惰,亞健康的我們) baocai.buildVegetables(); caihua.buildVegetables(); } }
輸出
農(nóng)村人套路少,老實(shí),種的蘋果很脆很甜,沒有化學(xué)物質(zhì),賣的還便宜,付出收獲不成正比 農(nóng)村人套路少,老實(shí),自家地種的梨很脆很甜,沒有化學(xué)物質(zhì),而且還特便宜 農(nóng)村人種的包菜,地里面賣2毛錢一斤還送一斤,城里人買的包菜,2塊錢一斤還缺斤少兩,差價(jià)翻了10倍,還不是諸葛家種的,有可能是資本家種的轉(zhuǎn)基因包菜 農(nóng)村人種的菜花,地里面賣2毛錢一斤還送一斤,城里人買的菜花,2塊錢一斤還缺斤少兩,差價(jià)翻了10倍,還不是諸葛家種的,有可能是資本家種的轉(zhuǎn)基因菜花
總結(jié)
意圖:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定它們具體的類。
主要解決:主要解決接口選擇的問題。
何時(shí)使用:系統(tǒng)的產(chǎn)品有多于一個(gè)的產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一族的產(chǎn)品。
如何解決:在一個(gè)產(chǎn)品族里面,定義多個(gè)產(chǎn)品。
關(guān)鍵代碼: 在一個(gè)工廠里聚合多個(gè)同類產(chǎn)品。
應(yīng)用實(shí)例:工作了,為了參加一些聚會(huì),肯定有兩套或多套衣服吧,比如說有商務(wù)裝(成套,一系列具體產(chǎn)品)、時(shí)尚裝(成套,一系列具體產(chǎn)品),甚至對(duì)于一個(gè)家庭來說,可能有商務(wù)女裝、商務(wù)男裝、時(shí)尚女裝、時(shí)尚男裝,這些也都是成套的,即一系列具體產(chǎn)品。假設(shè)一種情況(現(xiàn)實(shí)中是不存在的,要不然,沒法進(jìn)入共產(chǎn)主義了,但有利于說明抽象工廠模式),在您的家中,某一個(gè)衣柜(具體工廠)只能存放某一種這樣的衣服(成套,一系列具體產(chǎn)品),每次拿這種成套的衣服時(shí)也自然要從這個(gè)衣柜中取出了。用 OOP 的思想去理解,所有的衣柜(具體工廠)都是衣柜類的(抽象工廠)某一個(gè),而每一件成套的衣服又包括具體的上衣(某一具體產(chǎn)品),褲子(某一具體產(chǎn)品),這些具體的上衣其實(shí)也都是上衣(抽象產(chǎn)品),具體的褲子也都是褲子(另一個(gè)抽象產(chǎn)品)。
優(yōu)點(diǎn):當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對(duì)象被設(shè)計(jì)成一起工作時(shí),它能保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對(duì)象。
缺點(diǎn):產(chǎn)品族擴(kuò)展非常困難,要增加一個(gè)系列的某一產(chǎn)品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼。
使用場(chǎng)景:
1、QQ 換皮膚,一整套一起換。
2、生成不同操作系統(tǒng)的程序。
注意事項(xiàng):產(chǎn)品族難擴(kuò)展,產(chǎn)品等級(jí)易擴(kuò)展。
感謝各位的閱讀,以上就是“Java的抽象工廠模式是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Java的抽象工廠模式是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!