廣東制作公司網(wǎng)站網(wǎng)上營(yíng)銷方法
抽象工廠模式
工廠方法模式中考慮的是一類產(chǎn)品的生產(chǎn),如畜牧場(chǎng)只養(yǎng)動(dòng)物、電視機(jī)廠只生產(chǎn)電視機(jī)、計(jì)算機(jī)軟件學(xué)院只培養(yǎng)計(jì)算機(jī)軟件專業(yè)的學(xué)生等。
同種類稱為同等級(jí),也就是說:工廠方法模式中只考慮生產(chǎn)同等級(jí)的產(chǎn)品,但是在現(xiàn)實(shí)生活中許多工廠是綜合型的工廠,能生產(chǎn)多等級(jí)(種類) 的產(chǎn)品,如農(nóng)場(chǎng)里既養(yǎng)動(dòng)物又種植物,電器廠既生產(chǎn)電視機(jī)又生產(chǎn)洗衣機(jī)或空調(diào),大學(xué)既有軟件專業(yè)又有生物專業(yè)等。
然而抽象工廠模式將考慮多等級(jí)產(chǎn)品的生產(chǎn),將同一個(gè)具體工廠所生產(chǎn)的位于不同等級(jí)的一組產(chǎn)品稱為一個(gè)產(chǎn)品族,圖 1 所示的是海爾工廠和 TCL 工廠所生產(chǎn)的電視機(jī)與空調(diào)對(duì)應(yīng)的關(guān)系圖。
圖1 電器工廠的產(chǎn)品等級(jí)與產(chǎn)品族
抽象工廠模式的定義與特點(diǎn)
抽象工廠(AbstractFactory)模式的定義:是一種為訪問類提供一個(gè)創(chuàng)建一組相關(guān)或相互依賴對(duì)象的接口,且訪問類無須指定所要產(chǎn)品的具體類就能得到同族的不同等級(jí)的產(chǎn)品的模式結(jié)構(gòu)。
使用抽象工廠模式一般要滿足以下條件:
- 可以在類的內(nèi)部對(duì)產(chǎn)品族中相關(guān)聯(lián)的多等級(jí)產(chǎn)品共同管理,而不必專門引入多個(gè)新的類來進(jìn)行管理。
- 當(dāng)需要產(chǎn)品族時(shí),抽象工廠可以保證客戶端始終只使用同一個(gè)產(chǎn)品的產(chǎn)品組。
- 抽象工廠增強(qiáng)了程序的可擴(kuò)展性,當(dāng)增加一個(gè)新的產(chǎn)品族時(shí),不需要修改原代碼,滿足開閉原則。
缺點(diǎn):當(dāng)產(chǎn)品族中需要增加一個(gè)新的產(chǎn)品時(shí),所有的工廠類都需要進(jìn)行修改。增加了系統(tǒng)的抽象性和理解難度。
抽象工廠模式的結(jié)構(gòu)
抽象工廠模式的主要角色如下。
-
抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,它包含多個(gè)創(chuàng)建產(chǎn)品的方法 newProduct(),可以創(chuàng)建多個(gè)不同等級(jí)的產(chǎn)品。
-
具體工廠(Concrete Factory):主要是實(shí)現(xiàn)抽象工廠中的多個(gè)抽象方法,完成具體產(chǎn)品的創(chuàng)建。
-
抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能,抽象工廠模式有多個(gè)抽象產(chǎn)品。
-
具體產(chǎn)品(ConcreteProduct):實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來創(chuàng)建,它同具體工廠之間是多對(duì)一的關(guān)系。
抽象工廠模式的主要角色如下。
圖2 抽象工廠模式的結(jié)構(gòu)圖
抽象工廠模式的適用場(chǎng)景
1. 當(dāng)需要將請(qǐng)求的發(fā)送者和接收者解耦時(shí),可以考慮使用抽象模式。
2. 當(dāng)存在多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求時(shí),可以考慮使用抽象模式。
3. 當(dāng)需要?jiǎng)討B(tài)地指定可以處理請(qǐng)求的對(duì)象時(shí),可以考慮使用抽象模式。
簡(jiǎn)單的代碼實(shí)現(xiàn)
// 抽象產(chǎn)品接口:操作系統(tǒng)
interface OperatingSystem {void run();
}// 具體產(chǎn)品:Windows操作系統(tǒng)
class WindowsOS implements OperatingSystem {@Overridepublic void run() {System.out.println("Running Windows OS");}
}// 具體產(chǎn)品:Linux操作系統(tǒng)
class LinuxOS implements OperatingSystem {@Overridepublic void run() {System.out.println("Running Linux OS");}
}// 抽象產(chǎn)品接口:應(yīng)用程序
interface Application {void open();
}// 具體產(chǎn)品:Word應(yīng)用程序
class WordApplication implements Application {@Overridepublic void open() {System.out.println("Opening Word Application");}
}// 具體產(chǎn)品:Excel應(yīng)用程序
class ExcelApplication implements Application {@Overridepublic void open() {System.out.println("Opening Excel Application");}
}// 抽象工廠接口
interface SoftwareFactory {OperatingSystem createOperatingSystem();Application createApplication();
}// 具體工廠:Windows工廠
class WindowsFactory implements SoftwareFactory {@Overridepublic OperatingSystem createOperatingSystem() {return new WindowsOS();}@Overridepublic Application createApplication() {return new ExcelApplication();}
}// 具體工廠:Linux工廠
class LinuxFactory implements SoftwareFactory {@Overridepublic OperatingSystem createOperatingSystem() {return new LinuxOS();}@Overridepublic Application createApplication() {return new WordApplication();}
}// 抽象工廠模式通過SoftwareFactory接口和其實(shí)現(xiàn)類來創(chuàng)建不同類型的操作系統(tǒng)和應(yīng)用程序。
// 客戶端代碼可以根據(jù)需要選擇不同的工廠實(shí)例來創(chuàng)建不同的產(chǎn)品組合。
public class Client {public static void main(String[] args) {SoftwareFactory windowsFactory = new WindowsFactory();OperatingSystem windowsOS = windowsFactory.createOperatingSystem();Application windowsApp = windowsFactory.createApplication();windowsOS.run();windowsApp.open();SoftwareFactory linuxFactory = new LinuxFactory();OperatingSystem linuxOS = linuxFactory.createOperatingSystem();Application linuxApp = linuxFactory.createApplication();linuxOS.run();linuxApp.open();}
}