摘要:類圖上面的這張圖引用設(shè)計(jì)模式之禪關(guān)于抽象工廠的通用類圖,說實(shí)話,我覺得這張圖很難懂,不容易表述抽象工廠模式也或許是個(gè)人理解能力。
前言
關(guān)于抽象工廠模式,博主初學(xué)的時(shí)候是懵逼的,花了好大力氣才明白它與工廠模式的異同,不得不說理解能力還有待加強(qiáng)(~。~)
什么是抽象工廠模式為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口,而且無(wú)須指定它們的具體類。
讓我們?cè)倩仡櫹鹿S模式的定義:
定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到子類。
從定義上看,區(qū)別在于抽象工廠是針對(duì)一組相關(guān)或依賴的對(duì)象(產(chǎn)品和產(chǎn)品之間有共同的約束),而工廠模式是針對(duì)一種產(chǎn)品。
UML類圖上面的這張圖引用設(shè)計(jì)模式之禪關(guān)于抽象工廠的通用類圖,說實(shí)話,我覺得這張圖很難懂,不容易表述抽象工廠模式(也或許是個(gè)人理解能力)。下面上我的例子:
抽象工廠模式是工廠方法模式的升級(jí)版本,在有多個(gè)業(yè)務(wù)品種、業(yè)務(wù)分類時(shí),通過抽象工廠模式產(chǎn)生需要的對(duì)象是一種非常好的解決方式。要想理解抽象工廠模式,有兩個(gè)概念我們是必須要理解的。
產(chǎn)品族:功能相關(guān)聯(lián)的一組產(chǎn)品,一般位于不同產(chǎn)品等級(jí)結(jié)構(gòu)的相同位置上,每一個(gè)產(chǎn)品族中的產(chǎn)品數(shù)應(yīng)該與產(chǎn)品等級(jí)結(jié)構(gòu)數(shù)一致。在上面的例子中:ComputerCpu和ComputerRam屬于一個(gè)產(chǎn)品族,MobileRam和MobileCpu屬于一個(gè)產(chǎn)品族.
產(chǎn)品等級(jí)結(jié)構(gòu): 一種產(chǎn)品內(nèi)部的不同等級(jí)。比如cpu下的computerCpu和MobileCpu,Ram下的computerRam和mobileRam.
看懂了嗎?沒看懂就再看一遍啊.....如果不理解這兩個(gè)概念,就不會(huì)理解抽象工廠,所以務(wù)必看懂再看接下來的文章.(想要更仔細(xì)的了解這兩個(gè)概念,可以觀看鏈接描述)
使用場(chǎng)景一組對(duì)象有相同的約束,就可以使用抽象工廠模式。就比如我們常用的qq音樂,有mac版的,有windows版的,他們共同的約束就是操作系統(tǒng)。相應(yīng)的在這個(gè)也無(wú)力,產(chǎn)品族有兩個(gè),mac版qq音樂和windows版qq音樂。產(chǎn)品等級(jí)結(jié)構(gòu)只有一個(gè)就是qq音樂了。
代碼分析按照上面的cpu和ram
public abstract class Cpu { public void introduce() { System.out.println("我是" + getOperationSystem() + "處理器,運(yùn)算速度賊快"); } abstract String getOperationSystem(); }
public class ComputerCpu extends Cpu { @Override String getOperationSystem() { return "pc"; } }
public class MobileCpu extends Cpu { @Override String getOperationSystem() { return "移動(dòng)端"; } }
public abstract class Ram { public void introduce(){ System.out.println("我是"+getOperationSystem()+"內(nèi)存,存取速度賊快"); } abstract String getOperationSystem(); }
public class ComputerRam extends Ram { @Override String getOperationSystem() { return "pc"; } }
public class MobileRam extends Ram { @Override String getOperationSystem() { return "移動(dòng)端"; } }
public abstract class AbstractFactory { abstract Cpu createCpu(); abstract Ram createRam(); }
public class ComputerFactory extends AbstractFactory { @Override Cpu createCpu() { return new ComputerCpu(); } @Override Ram createRam() { return new ComputerRam(); } }
public class MobileFactory extends AbstractFactory { @Override Cpu createCpu() { return new MobileCpu(); } @Override Ram createRam() { return new MobileRam(); } }
public class Client { public static void main(String[] args) { AbstractFactory computerFactory = new ComputerFactory(); AbstractFactory mobileFactory = new MobileFactory(); computerFactory.createCpu().introduce(); computerFactory.createRam().introduce(); mobileFactory.createCpu().introduce(); mobileFactory.createRam().introduce(); } } 測(cè)試結(jié)果: 我是pc處理器,運(yùn)算速度賊快 我是pc內(nèi)存,存取速度賊快 我是移動(dòng)端處理器,運(yùn)算速度賊快 我是移動(dòng)端內(nèi)存,存取速度賊快
相信只要前面的理論懂了,上面的這個(gè)小例子簡(jiǎn)直不要太輕松。
抽象廠模式具有封裝性,高層模塊在調(diào)用時(shí)根本不需要關(guān)心具體實(shí)現(xiàn)類,只要知道接口(抽象類)就可以了,我們不需要關(guān)心對(duì)象的創(chuàng)建問題,將創(chuàng)建對(duì)象的問題統(tǒng)統(tǒng)拋給工廠,只需知道一個(gè)工廠,就可以創(chuàng)造這個(gè)產(chǎn)品組的所有產(chǎn)品,優(yōu)秀的設(shè)計(jì)就該如此。
產(chǎn)品族內(nèi)的約束非公開狀態(tài),比如我使用手機(jī),用的cpu和ram肯定都是移動(dòng)端的,你總不可能手機(jī)用pc的cpu或者ram吧,本來就是不配套的配置。但是我們不需要去關(guān)心這個(gè),因?yàn)樗麄兊募s束都在工廠內(nèi)實(shí)現(xiàn)
總結(jié)抽象工廠模式主要是解決一組具有相同約束的對(duì)象的創(chuàng)建問題。其中最核心的概念就是產(chǎn)品族和產(chǎn)品等級(jí)結(jié)構(gòu),抽象工廠模式在擴(kuò)展產(chǎn)品等級(jí)結(jié)構(gòu)是非常容易的,只需要增加新的產(chǎn)品類和新的工廠類就可以,從這點(diǎn)看它是符合開閉原則的,若是想擴(kuò)展產(chǎn)品族,也就是增加一種產(chǎn)品,就需要?jiǎng)?chuàng)建對(duì)應(yīng)類,同時(shí)需要修改所有的工廠,是不符合開閉原則的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70626.html
摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的...
摘要:但本質(zhì)是,簡(jiǎn)單工廠并未嚴(yán)格遵循設(shè)計(jì)模式的開閉原則,當(dāng)需要增加新產(chǎn)品時(shí)也需要修改工廠代碼。但是工廠方法則嚴(yán)格遵守開閉原則,模式只負(fù)責(zé)抽象工廠接口,具體工廠交給客戶去擴(kuò)展。 最近開展了三次設(shè)計(jì)模式的公開課,現(xiàn)在來總結(jié)一下設(shè)計(jì)模式在PHP中的應(yīng)用,這是第二篇?jiǎng)?chuàng)建型模式之工廠模式。 設(shè)計(jì)模式的一般介紹在第一篇文章講了,這里就不重復(fù)。 工廠模式 實(shí)現(xiàn):定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)...
摘要:所謂的產(chǎn)品族,一般或多或少的都存在一定的關(guān)聯(lián),抽象工廠模式就可以在類內(nèi)部對(duì)產(chǎn)品族的關(guān)聯(lián)關(guān)系進(jìn)行定義和描述,而不必專門引入一個(gè)新的類來進(jìn)行管理。 0x01.定義與類型 定義:抽象工廠模式提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口 無(wú)需指定它們具體的類 類型:創(chuàng)建型 UML showImg(https://segmentfault.com/img/bVbtBp1?w=800&h=862...
摘要:主要詳解簡(jiǎn)單工廠模式到抽象工廠模式的演變。抽象工廠模式當(dāng)一個(gè)類別的產(chǎn)品還有多個(gè)系列區(qū)分時(shí),為了按系列生產(chǎn)商品,使用抽象工廠區(qū)分。 主要詳解簡(jiǎn)單工廠模式到抽象工廠模式的演變。 簡(jiǎn)單工廠模式 即靜態(tài)工廠模式1.將對(duì)象的創(chuàng)建和使用分開;2.將生產(chǎn)過程集中,便于集中管理;3.當(dāng)需要?jiǎng)?chuàng)建的對(duì)象類有變動(dòng)時(shí),就不用在所有new 的地方修改了,直接修改工廠類即可; /** * 簡(jiǎn)單工廠模式 ---...
閱讀 777·2023-04-25 15:13
閱讀 1399·2021-11-22 12:03
閱讀 826·2021-11-19 09:40
閱讀 1910·2021-11-17 09:38
閱讀 1714·2021-11-08 13:18
閱讀 655·2021-09-02 15:15
閱讀 1767·2019-08-30 15:54
閱讀 2636·2019-08-30 11:12