什么是抽象工厂模式?
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。它属于设计模式中的创建型模式,提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要组成部分
- 抽象工厂(Abstract Factory)
- 具体工厂(Concrete Factory)
- 抽象产品(Abstract Product)
- 具体产品(Concrete Product)
实现示例
让我们通过一个电子产品生产的例子来理解抽象工厂模式。
1. 首先定义抽象产品
// 手机接口
public interface Phone {
void call();
}
// 耳机接口
public interface Earphone {
void playMusic();
}2. 创建具体产品
// 苹果手机
public class IPhone implements Phone {
@Override
public void call() {
System.out.println("使用iPhone打电话");
}
}
// 苹果耳机
public class AirPods implements Earphone {
@Override
public void playMusic() {
System.out.println("使用AirPods播放音乐");
}
}
// 小米手机
public class MiPhone implements Phone {
@Override
public void call() {
System.out.println("使用小米手机打电话");
}
}
// 小米耳机
public class MiEarphone implements Earphone {
@Override
public void playMusic() {
System.out.println("使用小米耳机播放音乐");
}
}3. 定义抽象工厂
public interface ElectronicsFactory {
Phone createPhone();
Earphone createEarphone();
}4. 实现具体工厂
// 苹果产品工厂
public class AppleFactory implements ElectronicsFactory {
@Override
public Phone createPhone() {
return new IPhone();
}
@Override
public Earphone createEarphone() {
return new AirPods();
}
}
// 小米产品工厂
public class XiaomiFactory implements ElectronicsFactory {
@Override
public Phone createPhone() {
return new MiPhone();
}
@Override
public Earphone createEarphone() {
return new MiEarphone();
}
}5. 客户端使用示例
public class Client {
public static void main(String[] args) {
// 创建苹果工厂
ElectronicsFactory appleFactory = new AppleFactory();
Phone iPhone = appleFactory.createPhone();
Earphone airPods = appleFactory.createEarphone();
iPhone.call(); // 输出:使用iPhone打电话
airPods.playMusic(); // 输出:使用AirPods播放音乐
// 创建小米工厂
ElectronicsFactory xiaomiFactory = new XiaomiFactory();
Phone miPhone = xiaomiFactory.createPhone();
Earphone miEarphone = xiaomiFactory.createEarphone();
miPhone.call(); // 输出:使用小米手机打电话
miEarphone.playMusic(); // 输出:使用小米耳机播放音乐
}
}优点
- 分离接口和实现
- 使得切换产品族变得容易
- 保证了同一产品族中产品的一致性
缺点
- 产品族扩展困难
- 需要定义很多接口和类,增加系统复杂度
适用场景
- 系统需要独立于产品的创建、组合和表示时
- 系统要由多个产品系列中的一个来配置时
- 要强调一系列相关的产品对象的设计以便进行约束时
实际应用示例
数据库访问层实现
// 抽象工厂
public interface DatabaseFactory {
Connection createConnection();
Command createCommand();
Reader createReader();
}
// MySQL具体工厂
public class MySQLFactory implements DatabaseFactory {
@Override
public Connection createConnection() {
return new MySQLConnection();
}
@Override
public Command createCommand() {
return new MySQLCommand();
}
@Override
public Reader createReader() {
return new MySQLReader();
}
}
// Oracle具体工厂
public class OracleFactory implements DatabaseFactory {
@Override
public Connection createConnection() {
return new OracleConnection();
}
@Override
public Command createCommand() {
return new OracleCommand();
}
@Override
public Reader createReader() {
return new OracleReader();
}
}与其他模式的关系
- 工厂方法模式:通常用于创建单个产品
- 抽象工厂模式:用于创建一整族的相关产品
- 建造者模式:关注复杂对象的步骤化构建
总结
抽象工厂模式提供了一种封装一组具有相同主题的工厂的方法。它特别适合于需要创建一系列相关对象的场景,能够确保这些对象之间的兼容性。在实际应用中,数据库访问、GUI组件创建等场景都是抽象工厂模式的典型应用场景。
参考资料
- 《Design Patterns: Elements of Reusable Object-Oriented Software》
- 《Head First Design Patterns》
- Spring Framework 源码

