抽象工厂模式
简介
定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。
使用场景:
跨平台UI组件
不同数据库的访问
不同操作系统的产品族
实现要点:
产品族的概念
工厂接口定义创建方法
具体工厂创建具体产品
UML
代码示例
抽象产品
/**
* 1. 抽象产品A - 操作系统
*/
public interface OperatingSystem {
void boot();
void shutdown();
String getName();
}
/**
* 2. 抽象产品B - 浏览器
*/
public interface Browser {
void open();
void close();
String getName();
}具体产品
/**
* 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";
}
}抽象工厂
/**
* 7. 抽象工厂 - 定义创建产品的接口
*/
public interface SystemFactory {
OperatingSystem createOperatingSystem();
Browser createBrowser();
}具体工厂
/**
* 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();
}
}客户端
/**
* 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. 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?