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