您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java的抽象工廠模式是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java的抽象工廠模式是什么”吧!
抽象工廠模式
抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。
在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。
舉個例子:還是用農村人和城里人舉例吧,加深印象
首先,我是農村人,我老爸老媽就是個果農、菜農,種蘋果,梨,葡萄,包菜,菜花,辣椒等,農村人自己種的水果蔬菜,肯定很香,無公害,城里面水果大多不敢吃,大部分都是有錢人承包的果園菜園打農藥,催熟,膨大劑,美化粉,農村人雖然窮,但是很地道,不坑人,你們城里人想吃我們家的水果、蔬菜怎么辦,你們也只能去水果店蔬菜店買,由于大城市和農村距離產生了一個城市蔬菜水果批發大市場(超級工廠:里面什么東西都有,有水果,有蔬菜,有海鮮,肉類等等),水果店,蔬菜店(其他工廠)會在批發市場批發我們家的水果,蔬菜(前提有我們家的,緣分吧,應該機會太小,題外話,其實農民種的蔬菜水果,一般流入不到大城市的,有時候便宜的,就沒有商家來收的)
代碼實現
創建一個水果接口
/** * * @ClassName: Fruits * @Description: TODO(我們都是農村的,自己種的水果,肯定很香,無公害,城里面水果不敢吃,大部分都是打農藥,催熟,膨大劑,美化粉) * @author wangmeng * @date 2021年5月11日 */ public interface Fruits { // 諸葛家的水果地 public void buildFruits(); }
接口實現
蘋果地
public class Apple implements Fruits { @Override public void buildFruits() { System.out.println("農村人套路少,老實,種的蘋果很脆很甜,沒有化學物質,賣的還便宜,付出收獲不成正比"); } }
梨
public class Pear implements Fruits { @Override public void buildFruits() { System.out.println("農村人套路少,老實,自家地種的梨很脆很甜,沒有化學物質,而且還特便宜"); } }
創建一個蔬菜接口
/** * * @ClassName: Vegetables * @Description: TODO(蔬菜接口) * @author wangmeng * @date 2021年5月11日 */ public interface Vegetables { // 諸葛家的蔬菜地 public void buildVegetables(); }
蔬菜接口實現
包菜地
/** * * @ClassName: BaoCai * @Description: TODO(包菜地,主要生產包菜的) * @author 諸葛孔暗 * @date 2021年5月12日 */ public class BaoCai implements Vegetables { @Override public void buildVegetables() { System.out.println("農村人種的包菜,地里面賣2毛錢一斤還送一斤,城里人買的包菜,2塊錢一斤還缺斤少兩,差價翻了10倍,還不是諸葛家種的,有可能是資本家種的轉基因包菜"); } }
菜花地
/** * * @ClassName: CaiHua * @Description: TODO(菜花地,主要生產菜花的) * @author 諸葛孔暗 * @date 2021年5月12日 */ public class CaiHua implements Vegetables { @Override public void buildVegetables() { System.out.println("農村人種的菜花,地里面賣2毛錢一斤還送一斤,城里人買的菜花,2塊錢一斤還缺斤少兩,差價翻了10倍,還不是諸葛家種的,有可能是資本家種的轉基因菜花"); } }
為 Fruits(水果)和 Vegetables (蔬菜)對象創建抽象類來獲取工廠
/** * * @ClassName: AbstractFactory * @Description: TODO(為 Fruits(水果)和 Vegetables (蔬菜)對象創建抽象類來獲取工廠,功能相當于大型批發市場了) * @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(生活小常識:水果超市也有可能賣蔬菜:比如:妹子們都愛黃瓜,哈哈···,就去水果店就能買到,但它是蔬菜啊) * @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; } }
創建大型批發市場大老板,生產水果和蔬菜(創建一個工廠創造器/生成器類,通過傳遞水果蔬菜類型信息來獲取工廠。)
/** * * @ClassName: FactoryProducer * @Description: TODO(創建大型批發市場大老板,生產水果和蔬菜(創建一個工廠創造器/生成器類,通過傳遞水果蔬菜類型信息來獲取工廠。)) * @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; } }
測試
/** * * @ClassName: Test * @Description: TODO(實現過程都是通過類型獲取對象) * @author wangmeng * @date 2021年5月12日 */ public class Test { public static void main(String[] args) { // 農民凌晨12點把水果運到了批發市場(辛苦的農民人,白天耕地,半夜賣菜的農民人,可憐天下父母心) AbstractFactory fruitsFactory=FactoryProducer.getFactory("Fruits"); // 超市老板凌晨5點去批發市場批發了蘋果和梨(早起的創業人) Fruits apple=fruitsFactory.getFruits("Apple"); Fruits pear=fruitsFactory.getFruits("Pear"); // 太陽升起來了,城里人睡到了中午12點了,算了不吃飯了,去水果超市買兩個諸葛標簽的蘋果和梨吃,無公害(懶惰,亞健康的我們) apple.buildFruits(); pear.buildFruits(); // 農民凌晨12點把蔬菜運到了批發市場(白天耕地,半夜賣菜的農民人,可憐天下父母心) AbstractFactory vegetablesFactory = FactoryProducer.getFactory("Vegetables"); // 超市老板凌晨5點去批發市場批發了蘋果和梨(早起的創業人,比農民聰明點,早起早睡) Vegetables baocai = vegetablesFactory.getVegetables("Baocai"); Vegetables caihua = vegetablesFactory.getVegetables("caihua"); // 太陽升起來了,城里人睡到了中午12點了,算了不吃飯了,去蔬菜超市買兩個諸葛標簽的包菜和菜花下午包餃子吃,無公害(懶惰,亞健康的我們) baocai.buildVegetables(); caihua.buildVegetables(); } }
輸出
農村人套路少,老實,種的蘋果很脆很甜,沒有化學物質,賣的還便宜,付出收獲不成正比 農村人套路少,老實,自家地種的梨很脆很甜,沒有化學物質,而且還特便宜 農村人種的包菜,地里面賣2毛錢一斤還送一斤,城里人買的包菜,2塊錢一斤還缺斤少兩,差價翻了10倍,還不是諸葛家種的,有可能是資本家種的轉基因包菜 農村人種的菜花,地里面賣2毛錢一斤還送一斤,城里人買的菜花,2塊錢一斤還缺斤少兩,差價翻了10倍,還不是諸葛家種的,有可能是資本家種的轉基因菜花
總結
意圖: 提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
主要解決: 主要解決接口選擇的問題。
何時使用:系統的產品有多于一個的產品族,而系統只消費其中某一族的產品。
如何解決:在一個產品族里面,定義多個產品。
關鍵代碼: 在一個工廠里聚合多個同類產品。
應用實例:工作了,為了參加一些聚會,肯定有兩套或多套衣服吧,比如說有商務裝(成套,一系列具體產品)、時尚裝(成套,一系列具體產品),甚至對于一個家庭來說,可能有商務女裝、商務男裝、時尚女裝、時尚男裝,這些也都是成套的,即一系列具體產品。假設一種情況(現實中是不存在的,要不然,沒法進入共產主義了,但有利于說明抽象工廠模式),在您的家中,某一個衣柜(具體工廠)只能存放某一種這樣的衣服(成套,一系列具體產品),每次拿這種成套的衣服時也自然要從這個衣柜中取出了。用 OOP 的思想去理解,所有的衣柜(具體工廠)都是衣柜類的(抽象工廠)某一個,而每一件成套的衣服又包括具體的上衣(某一具體產品),褲子(某一具體產品),這些具體的上衣其實也都是上衣(抽象產品),具體的褲子也都是褲子(另一個抽象產品)。
優點:當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼。
使用場景:
1、QQ 換皮膚,一整套一起換。
2、生成不同操作系統的程序。
注意事項:產品族難擴展,產品等級易擴展。
感謝各位的閱讀,以上就是“Java的抽象工廠模式是什么”的內容了,經過本文的學習后,相信大家對Java的抽象工廠模式是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。