抽象工厂设计模式示例
本文是我們名為“ Java設計模式 ”的學院課程的一部分。
在本課程中,您將深入研究大量的設計模式,并了解如何在Java中實現和利用它們。 您將了解模式如此重要的原因,并了解何時以及如何應用模式中的每一個。 在這里查看 !
目錄
1.簡介 2.什么是抽象工廠設計模式 3.實施抽象工廠設計模式 4.何時使用抽象工廠設計模式 5. JDK中的抽象工廠模式 6.下載源代碼1.簡介
在上一課中 ,我們為一家產品公司開發了一個應用程序,用于解析XML并將結果顯示給他們。 為此,我們為公司與其客戶之間的不同通信類型創建了不同的解析器。 我們使用工廠方法設計模式來解決他們的問題。
該應用程序適合他們。 但是現在客戶不想遵循公司的特定XML規則。 客戶希望使用自己的XML規則與產品公司進行通信。 這意味著對于每個客戶,公司都應具有客戶特定的XML解析器。 例如,對于NY客戶端,應該有四種特定類型的XML解析器,即NYErrorXMLParser,NYFeedbackXML,NYOrderXMLParser,NYResponseXMLParser和TW客戶端的四種不同的解析器。
公司已要求您根據新要求更改應用程序。 為了開發解析器應用程序,我們使用了工廠方法設計模式,其中要使用的確切對象由子類根據解析器的類型決定。 現在,為了實現這一新要求,我們將使用工廠工廠,即抽象工廠。
這次我們需要根據客戶端特定的XML進行解析器,因此我們將為不同的客戶端創建不同的工廠,這將為我們提供要解析的客戶端特定的XML。 為此,我們將創建一個抽象工廠,然后實現該工廠以提供特定于客戶的XML工廠。 然后,我們將使用該工廠來獲取所需的客戶端特定的XML解析器對象。
抽象工廠是我們選擇的設計模式,在實現它來解決我們的問題之前,請讓我們進一步了解它。
2.什么是抽象工廠設計模式
抽象工廠(AKA Kit)是一種設計模式,它提供了一個接口,用于創建相關或相關對象的族,而無需指定其具體類。 抽象工廠模式將“工廠方法模式”的概念提高到了一個新的水平。 抽象工廠是一個類,提供提供產生一系列對象的接口。 在Java中,可以使用接口或抽象類來實現它。
當客戶對象想要創建一組相關的相關類的實例,而又不必知道要實例化哪個具體的具體類時,抽象工廠模式很有用。 不同的具體工廠實現抽象工廠接口。 客戶對象利用這些具體工廠來創建對象,因此不需要知道實際實例化了哪個具體類。
抽象工廠可用于插入不同的對象組以更改系統的行為。 對于每個小組或家庭,都將建立一個具體工廠來管理對象的創建以及它們之間的相互依賴性和一致性要求。 每個具體工廠都實現抽象工廠的接口
圖1
抽象工廠
- 聲明用于創建抽象產品對象的操作的接口。
混凝土工廠
- 實施操作以創建具體的產品對象。
抽象產品
- 聲明一種產品對象的接口。
混凝土產品
- 定義要由相應的混凝土工廠創建的產品對象。
- 實現AbstractProduct接口。
客戶
- 僅使用由AbstractFactory和AbstractProduct類聲明的接口。
3.實施抽象工廠設計模式
為了實現抽象工廠設計模式,我們將首先創建一個將由所有具體工廠實現的接口。
package com.javacodegeeks.patterns.abstractfactorypattern;public interface AbstractParserFactory {public XMLParser getParserInstance(String parserType); }上面的接口由客戶端特定的具體工廠實現,該工廠將向客戶端對象提供XML解析器對象。 getParserInstance方法使用parserType作為參數,該參數用于獲取特定于消息的(錯誤解析器,訂單解析器等)解析器對象。
兩個特定于客戶端的具體解析器工廠是:
package com.javacodegeeks.patterns.abstractfactorypattern;public class NYParserFactory implements AbstractParserFactory {@Overridepublic XMLParser getParserInstance(String parserType) {switch(parserType){case "NYERROR": return new NYErrorXMLParser();case "NYFEEDBACK": return new NYFeedbackXMLParser ();case "NYORDER": return new NYOrderXMLParser();case "NYRESPONSE": return new NYResponseXMLParser();}return null;}}package com.javacodegeeks.patterns.abstractfactorypattern;public class TWParserFactory implements AbstractParserFactory {@Overridepublic XMLParser getParserInstance(String parserType) {switch(parserType){case "TWERROR": return new TWErrorXMLParser();case "TWFEEDBACK": return new TWFeedbackXMLParser ();case "TWORDER": return new TWOrderXMLParser();case "TWRESPONSE": return new TWResponseXMLParser();}return null;}}上面的兩個工廠實現了AbstractParserFactory接口,并覆蓋了getParserInstance方法。 它根據參數中請求的解析器??類型返回特定于客戶端的解析器對象。
package com.javacodegeeks.patterns.abstractfactorypattern;public interface XMLParser {public String parse();}上面的接口由具體的解析器類實現,以解析XML并返回字符串消息。
該公司與其客戶之間有兩個客戶以及四種不同類型的消息交換。 因此,應該有六種不同類型的特定于客戶端的XML解析器。
package com.javacodegeeks.patterns.abstractfactorypattern;public class NYErrorXMLParser implements XMLParser{@Overridepublic String parse() {System.out.println("NY Parsing error XML...");return "NY Error XML Message";}}package com.javacodegeeks.patterns.abstractfactorypattern;public class NYFeedbackXMLParser implements XMLParser{@Overridepublic String parse() {System.out.println("NY Parsing feedback XML...");return "NY Feedback XML Message";}}package com.javacodegeeks.patterns.abstractfactorypattern;public class NYOrderXMLParser implements XMLParser{@Overridepublic String parse() {System.out.println("NY Parsing order XML...");return "NY Order XML Message";}}package com.javacodegeeks.patterns.abstractfactorypattern;public class NYResponseXMLParser implements XMLParser{@Overridepublic String parse() {System.out.println("NY Parsing response XML...");return "NY Response XML Message";}}package com.javacodegeeks.patterns.abstractfactorypattern;public class TWErrorXMLParser implements XMLParser{@Overridepublic String parse() {System.out.println("TW Parsing error XML...");return "TW Error XML Message";}}package com.javacodegeeks.patterns.abstractfactorypattern;public class TWFeedbackXMLParser implements XMLParser{@Overridepublic String parse() {System.out.println("TW Parsing feedback XML...");return "TW Feedback XML Message";}}package com.javacodegeeks.patterns.abstractfactorypattern;public class TWOrderXMLParser implements XMLParser{@Overridepublic String parse() {System.out.println("TW Parsing order XML...");return "TW Order XML Message";}}package com.javacodegeeks.patterns.abstractfactorypattern;public class TWResponseXMLParser implements XMLParser{@Overridepublic String parse() {System.out.println("TW Parsing response XML...");return "TW Response XML Message";}}為了避免客戶代碼和工廠之間的依賴性,可選地,我們實現了一個工廠生產者,該生產者具有靜態方法,并負責向客戶對象提供所需的工廠對象。
package com.javacodegeeks.patterns.abstractfactorypattern;public final class ParserFactoryProducer {private ParserFactoryProducer(){throw new AssertionError();}public static AbstractParserFactory getFactory(String factoryType){switch(factoryType){case "NYFactory": return new NYParserFactory();case "TWFactory": return new TWParserFactory();}return null;}}現在,讓我們測試代碼。
package com.javacodegeeks.patterns.abstractfactorypattern;public class TestAbstractFactoryPattern {public static void main(String[] args) {AbstractParserFactory parserFactory = ParserFactoryProducer.getFactory("NYFactory");XMLParser parser = parserFactory.getParserInstance("NYORDER");String msg="";msg = parser.parse();System.out.println(msg);System.out.println("************************************");parserFactory = ParserFactoryProducer.getFactory("TWFactory");parser = parserFactory.getParserInstance("TWFEEDBACK");msg = parser.parse();System.out.println(msg);}}上面的代碼將導致以下輸出:
NY Parsing order XML... NY Order XML Message ************************************ TW Parsing feedback XML... TW Feedback XML Message在上面的課程中,我們首先從工廠生產商那里獲得了NY工廠,然后從NY分析器工廠獲得了Order XML分析器。 然后,我們在解析器對象上調用了parse方法,并顯示了返回消息。 正如輸出中清楚顯示的那樣,我們為TW客戶執行了相同的操作。
4.何時使用抽象工廠設計模式
在以下情況下使用抽象工廠模式
- 系統應獨立于其產品的創建,組成和表示方式。
- 系統應配置有多個產品系列之一。
- 相關產品對象系列旨在一起使用,因此您需要強制執行此約束。
- 您想提供產品的類庫,并且只想顯示它們的接口,而不是它們的實現。
5. JDK中的抽象工廠模式
- java.util.Calendar#getInstance()
- java.util.Arrays#asList()
- java.util.ResourceBundle#getBundle()
- java.sql.DriverManager#getConnection()
- java.sql.Connection#createStatement()
- java.sql.Statement#executeQuery()
- java.text.NumberFormat#getInstance()
- javax.xml.transform.TransformerFactory#newInstance()
6.下載源代碼
這是關于“抽象工廠設計模式”的課程。 您可以在此處下載源代碼: AbstractFactoryPattern-Project
翻譯自: https://www.javacodegeeks.com/2015/09/abstract-factory-design-pattern.html
總結
以上是生活随笔為你收集整理的抽象工厂设计模式示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天猫赠品设置(天猫赠品设置规则)
- 下一篇: eclipse鼠标变十了_Eclipse