抽象工厂模式

简介

定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。

使用场景:

  • 跨平台UI组件

  • 不同数据库的访问

  • 不同操作系统的产品族

实现要点:

  • 产品族的概念

  • 工厂接口定义创建方法

  • 具体工厂创建具体产品

UML

代码示例

  1. 抽象产品

/**
 * 1. 抽象产品A - 操作系统
 */
public interface OperatingSystem {
    void boot();

    void shutdown();

    String getName();
}

/**
 * 2. 抽象产品B - 浏览器
 */
public interface Browser {
    void open();

    void close();

    String getName();
}
  1. 具体产品

/**
 * 3. 具体产品A1 - Windows操作系统
 */
public class WindowsOS implements OperatingSystem {
    @Override
    public void boot() {
        System.out.println("Windows系统启动中...");
    }

    @Override
    public void shutdown() {
        System.out.println("Windows系统关闭中...");
    }

    @Override
    public String getName() {
        return "Windows";
    }
}
/**
 * 4. 具体产品A2 - macOS操作系统
 */
public class MacOS implements OperatingSystem {
    @Override
    public void boot() {
        System.out.println("macOS系统启动中...");
    }

    @Override
    public void shutdown() {
        System.out.println("macOS系统关闭中...");
    }

    @Override
    public String getName() {
        return "macOS";
    }
}
/**
 * 5. 具体产品B1 - Chrome浏览器
 */
public class ChromeBrowser implements Browser {
    @Override
    public void open() {
        System.out.println("Chrome浏览器打开中...");
    }

    @Override
    public void close() {
        System.out.println("Chrome浏览器关闭中...");
    }

    @Override
    public String getName() {
        return "Chrome";
    }
}
/**
 * 6. 具体产品B2 - Safari浏览器
 */
public class SafariBrowser implements Browser {
    @Override
    public void open() {
        System.out.println("Safari浏览器打开中...");
    }

    @Override
    public void close() {
        System.out.println("Safari浏览器关闭中...");
    }

    @Override
    public String getName() {
        return "Safari";
    }
}
  1. 抽象工厂

/**
 * 7. 抽象工厂 - 定义创建产品的接口
 */
public interface SystemFactory {

    OperatingSystem createOperatingSystem();

    Browser createBrowser();

}
  1. 具体工厂

/**
 * 8. 具体工厂1 - Windows系统工厂
 */
public class WindowsSystemFactory implements SystemFactory {
    @Override
    public OperatingSystem createOperatingSystem() {
        return new WindowsOS();
    }

    @Override
    public Browser createBrowser() {
        return new ChromeBrowser();
    }
}
/**
 * 9. 具体工厂2 - macOS系统工厂
 */
public class MacSystemFactory implements SystemFactory {
    @Override
    public OperatingSystem createOperatingSystem() {
        return new MacOS();
    }

    @Override
    public Browser createBrowser() {
        return new SafariBrowser();
    }
}
  1. 客户端

/**
 * 10. 客户端 - 使用抽象工厂
 */
public class ComputerSystem {
    private OperatingSystem os;
    private Browser browser;

    public ComputerSystem(SystemFactory factory) {
        this.os = factory.createOperatingSystem();
        this.browser = factory.createBrowser();
    }

    public void startSystem() {
        System.out.println("=== 启动计算机系统 ===");
        os.boot();
        browser.open();
        System.out.println("系统启动完成!\n");
    }

    public void shutdownSystem() {
        System.out.println("=== 关闭计算机系统 ===");
        browser.close();
        os.shutdown();
        System.out.println("系统关闭完成!\n");
    }

    public void showSystemInfo() {
        System.out.println("系统信息:");
        System.out.println("操作系统:" + os.getName());
        System.out.println("浏览器:" + browser.getName() + "\n");
    }
}
  1. 使用方式

/**
 * 抽象工厂模式定义:
 * 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
 *
 * 核心组件:
 * 1. AbstractFactory(抽象工厂)
 * 2. ConcreteFactory(具体工厂)
 * 3. AbstractProduct(抽象产品)
 * 4. ConcreteProduct(具体产品)
 * 5. Client(客户端)
 */
public class Test {
    public static void main(String[] args) {
        //windows 操作系统
        WindowsSystemFactory windowsSystemFactory = new WindowsSystemFactory();
        ComputerSystem windowSystem = new ComputerSystem(windowsSystemFactory);
        windowSystem.startSystem();
        windowSystem.showSystemInfo();
        windowSystem.shutdownSystem();

        //mac操作系统
        MacSystemFactory macSystemFactory = new MacSystemFactory();
        ComputerSystem macSystem = new ComputerSystem(macSystemFactory);
        macSystem.startSystem();
        macSystem.showSystemInfo();
        macSystem.shutdownSystem();

        // 演示工厂方法的灵活性
        System.out.println("=== 工厂方法灵活性演示 ===");
        OperatingSystem windowsOS = windowsSystemFactory.createOperatingSystem();
        Browser chromeBrowser = windowsSystemFactory.createBrowser();

        OperatingSystem macOS = macSystemFactory.createOperatingSystem();
        Browser safariBrowser = macSystemFactory.createBrowser();

        System.out.println("Windows系统 + Chrome浏览器组合:");
        windowsOS.boot();
        chromeBrowser.open();

        System.out.println("\nmacOS系统 + Safari浏览器组合:");
        macOS.boot();
        safariBrowser.open();

    }
}

Last updated

Was this helpful?