問題:
在某些情況下,需要?jiǎng)?chuàng)建一系列相關(guān)或相互依賴的對象,這些對象屬于一組相關(guān)的產(chǎn)品族。同時(shí),系統(tǒng)需要保證這些產(chǎn)品族之間的一致性。如果直接在代碼中創(chuàng)建這些對象,會(huì)使得代碼與具體產(chǎn)品的細(xì)節(jié)緊密耦合,不利于后續(xù)的擴(kuò)展和維護(hù)。
解決方案:
抽象工廠模式提供了一個(gè)接口,用于創(chuàng)建一系列相關(guān)或相互依賴的對象。通過使用抽象工廠接口及其具體實(shí)現(xiàn),可以將對象的創(chuàng)建與客戶端代碼分離,從而實(shí)現(xiàn)系統(tǒng)的松耦合。抽象工廠模式涉及多個(gè)角色:
- 抽象工廠(Abstract Factory):聲明了一組用于創(chuàng)建不同產(chǎn)品的抽象方法。具體的工廠類必須實(shí)現(xiàn)這些方法來創(chuàng)建具體的產(chǎn)品對象。
- 具體工廠(Concrete Factory):實(shí)現(xiàn)抽象工廠接口,負(fù)責(zé)創(chuàng)建特定種類的產(chǎn)品對象。
- 抽象產(chǎn)品(Abstract Product):定義了產(chǎn)品的通用接口,具體產(chǎn)品必須實(shí)現(xiàn)這個(gè)接口。
- 具體產(chǎn)品(Concrete Product):實(shí)現(xiàn)抽象產(chǎn)品接口,是抽象工廠創(chuàng)建的實(shí)際對象。
效果:
抽象工廠模式的使用可以帶來以下效果:
- 產(chǎn)品族一致性:抽象工廠確保創(chuàng)建的產(chǎn)品是一組相關(guān)的產(chǎn)品族,保證了這些產(chǎn)品之間的一致性。
- 松耦合:客戶端代碼不需要直接依賴于具體產(chǎn)品,只需要通過抽象工廠接口創(chuàng)建產(chǎn)品,從而降低了代碼的耦合度。
- 可擴(kuò)展性:增加新的產(chǎn)品族或產(chǎn)品變得相對容易,只需要添加新的具體工廠和產(chǎn)品類即可,不需要修改現(xiàn)有代碼。
- 限制:抽象工廠模式要求系統(tǒng)中的每個(gè)產(chǎn)品族都必須有一個(gè)對應(yīng)的具體工廠,這可能增加了系統(tǒng)的復(fù)雜性。
抽象工廠模式適用于需要?jiǎng)?chuàng)建一系列相關(guān)產(chǎn)品并保證它們之間一致性的情況,例如圖形界面庫中的UI元素,不同操作系統(tǒng)下的界面組件等。通過使用抽象工廠模式,可以更好地管理和組織這些產(chǎn)品的創(chuàng)建過程。
代碼示例:
// 抽象產(chǎn)品接口:操作系統(tǒng)
interface OperatingSystem {
void run();
}
// 具體產(chǎn)品:Windows操作系統(tǒng)
class WindowsOS implements OperatingSystem {
@Override
public void run() {
System.out.println("Running Windows OS");
}
}
// 具體產(chǎn)品:Linux操作系統(tǒng)
class LinuxOS implements OperatingSystem {
@Override
public 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 {
@Override
public void open() {
System.out.println("Opening Word Application");
}
}
// 具體產(chǎn)品:Excel應(yīng)用程序
class ExcelApplication implements Application {
@Override
public void open() {
System.out.println("Opening Excel Application");
}
}
// 抽象工廠接口
interface SoftwareFactory {
OperatingSystem createOperatingSystem();
Application createApplication();
}
// 具體工廠:Windows工廠
class WindowsFactory implements SoftwareFactory {
@Override
public OperatingSystem createOperatingSystem() {
return new WindowsOS();
}
@Override
public Application createApplication() {
return new ExcelApplication();
}
}
// 具體工廠:Linux工廠
class LinuxFactory implements SoftwareFactory {
@Override
public OperatingSystem createOperatingSystem() {
return new LinuxOS();
}
@Override
public Application createApplication() {
return new WordApplication();
}
}
// 在這個(gè)示例中,抽象工廠模式通過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();
}
}