中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java的抽象工廠模式是什么

發布時間:2021-06-25 10:27:43 來源:億速云 閱讀:147 作者:chen 欄目:編程語言

這篇文章主要講解了“Java的抽象工廠模式是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java的抽象工廠模式是什么”吧!

抽象工廠模式

抽象工廠模式

抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。

在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。

舉個例子:還是用農村人和城里人舉例吧,加深印象

首先,我是農村人,我老爸老媽就是個果農、菜農,種蘋果,梨,葡萄,包菜,菜花,辣椒等,農村人自己種的水果蔬菜,肯定很香,無公害,城里面水果大多不敢吃,大部分都是有錢人承包的果園菜園打農藥,催熟,膨大劑,美化粉,農村人雖然窮,但是很地道,不坑人,你們城里人想吃我們家的水果、蔬菜怎么辦,你們也只能去水果店蔬菜店買,由于大城市和農村距離產生了一個城市蔬菜水果批發大市場(超級工廠:里面什么東西都有,有水果,有蔬菜,有海鮮,肉類等等),水果店,蔬菜店(其他工廠)會在批發市場批發我們家的水果,蔬菜(前提有我們家的,緣分吧,應該機會太小,題外話,其實農民種的蔬菜水果,一般流入不到大城市的,有時候便宜的,就沒有商家來收的)

Java的抽象工廠模式是什么

代碼實現

  • 創建一個水果接口

    /**
     * 
     * @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的抽象工廠模式是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蒙城县| 宜兰市| 兴和县| 石城县| 明水县| 吴桥县| 永仁县| 永修县| 西吉县| 长泰县| 双牌县| 巴林左旗| 乡宁县| 奇台县| 郸城县| 休宁县| 榆中县| 阳谷县| 望城县| 花莲市| 东光县| 高雄县| 嘉义市| 苍梧县| 新兴县| 澄迈县| 五家渠市| 恭城| 南华县| 沅陵县| 集贤县| 临江市| 马公市| 延津县| 沭阳县| 蒲城县| 兰考县| 嘉义县| 池州市| 大英县| 顺义区|