您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Java中什么是抽象工廠,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
在現實生活中許多工廠是綜合型的工廠,能生產多種類)的產品,就拿案例里面的可樂來說,在節日的時候可能會有圣誕版的可樂,也可能有新年版的可樂(如果不存在就假設),這篇文章要介紹的抽象工廠模式將考慮多等級產品的生產,將同一個具體工廠所生產的位于不同等級的一組產品稱為一個產品族。
比如:
抽象工廠模式的定義:
是一種為訪問類提供一個創建一組相關或相互依賴對象的接口,且訪問類無須指定所要產品的具體類就能得到同族的不同等級的產品的模式結構。
抽象工廠模式是工廠方法模式的升級版本,工廠方法模式只生產一個等級的產品,而抽象工廠模式可生產多個等級的產品。
使用抽象工廠模式一般要滿足以下條件:
系統中有多個產品族,每個具體工廠創建同一族但屬于不同等級結構的產品
系統一次只可能消費其中某一族產品,即同族的產品一起使用
優點:
可以在類的內部對產品族中相關聯的多等級產品共同管理,而不必專門引入多個新的類來進行管理
當需要產品族時,抽象工廠可以保證客戶端始終只使用同一個產品的產品組
抽象工廠增強了程序的可擴展性,當增加一個新的產品族時,不需要修改原代碼,滿足開閉原則
缺點:
當產品族中需要增加一個新的產品時,所有的工廠類都需要進行修改。增加了系統的抽象性和理解難度
抽象工廠模式同工廠方法模式一樣,也是由抽象工廠、具體工廠、抽象產品和具體產品等 4 個要素構成,但抽象工廠中方法個數不同,抽象產品的個數也不同。現在我們來分析其基本結構和實現方法
模式的結構:
抽象工廠:提供了創建產品的接口,它包含多個創建產品的方法 newProduct(),可以創建多個不同等級的產品
具體工廠:主要是實現抽象工廠中的多個抽象方法,完成具體產品的創建
抽象產品:定義了產品的規范,描述了產品的主要特性和功能,抽象工廠模式有多個抽象產品
具體產品:實現了抽象產品角色所定義的接口,由具體工廠來創建,它同具體工廠之間是多對一的關系
這里還是以上面兩篇文章的可樂工廠進行擴展,將按照以下的結構圖來設計和實現:
抽象可樂工廠結構圖(自繪):
可口可樂接口:
public interface CocaCola { public void CocaCola(); }
百事可樂接口:
public interface PepsiCola { public void PepsiCola(); }
圣誕版可口可樂:
/** * 生產圣誕版可口可樂的方法 */ public class ChristmasCocaCola implements CocaCola{ @Override public void CocaCola() { System.out.println("生產了圣誕版的可口可樂"); } }
新年版可口可樂:
/** * 生產新年版的可口可樂 */ public class NewYearCocaCola implements CocaCola{ @Override public void CocaCola() { System.out.println("生產了新年版的可口可樂"); } }
圣誕版百事可樂:
/** * 生產圣誕版百事可樂方法 */ public class ChristmasPepsiCola implements PepsiCola{ @Override public void PepsiCola() { System.out.println("生產了圣誕版的百事可樂"); } }
新年版百事可樂:
/** * 生產新年版百事可樂的方法 */ public class NewYearPepsiCola implements PepsiCola{ @Override public void PepsiCola() { System.out.println("生產了新年版的百事可樂"); } }
可樂工廠(抽象工廠):
/** * 可樂工廠(抽象工廠) * 可以生產兩種版本的可樂 */ public interface ColaFactory { //生產可口可樂:兩個版本 public CocaCola getCocaCola(); //生產百事可樂:兩個版本 public PepsiCola getPepsi(); }
圣誕版系列可樂工廠:
/** * 圣誕系列加工廠 * 生產 圣誕的百事可樂和可口可樂 */ public class ChristmasFactory implements ColaFactory{ @Override public CocaCola getCocaCola() { return new ChristmasCocaCola(); } @Override public PepsiCola getPepsi() { return new ChristmasPepsiCola(); } }
新年版系列可樂工廠:
/** * 新年版的加工廠 * 可以生產新年版的可口可樂和百事可樂 */ public class NewYearFactory implements ColaFactory{ @Override public CocaCola getCocaCola() { return new NewYearCocaCola(); } @Override public PepsiCola getPepsi() { return new NewYearPepsiCola(); } }
客戶端(測試類):
public class Test { public static void main(String[] args) { //生產圣誕版可口可樂: ColaFactory factory = new ChristmasFactory(); CocaCola cola = factory.getCocaCola(); cola.CocaCola(); //生產圣誕版百事可樂: ColaFactory factory1 = new ChristmasFactory(); PepsiCola pepsiCola = factory1.getPepsi(); pepsiCola.PepsiCola(); //生產新年版的可口可樂: ColaFactory factory2 = new NewYearFactory(); CocaCola cola1 = factory2.getCocaCola(); cola1.CocaCola(); //生產新年版的百事可樂: ColaFactory factory3 = new NewYearFactory(); PepsiCola pepsiCola1 = factory3.getPepsi(); pepsiCola1.PepsiCola(); } }
輸出結果:
生產了圣誕版的可口可樂
生產了圣誕版的百事可樂
生產了新年版的可口可樂
生產了新年版的百事可樂
這就是抽象工廠方法模式的可樂工廠,并且同一個具體工廠所生產的位于不同等級的一組產品稱為一個產品族。
當需要創建的對象是一系列相互關聯或相互依賴的產品族時,比如飲料工廠內的多款飲料
系統中有多個產品族,但每次只使用其中的某一族產品。比如一個只喝圣誕版的可口可樂和新年版的百事可樂
系統中提供了產品的類庫,且所有產品的接口相同,客戶端不依賴產品實例的創建細節和內部結構。
當增加一個新的產品族時只需增加一個新的具體工廠,不需要修改原代碼,滿足開閉原則
當產品族中需要增加一個新種類的產品時,則所有的工廠類都需要進行修改,不滿足開閉原則
注意: 當系統中只存在一個等級結構的產品時,抽象工廠模式將退化到工廠方法模式
最后:一張圖看懂簡單工廠模式、工廠方法模式、抽象工廠模式:
關于“Java中什么是抽象工廠”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。