设计模式--抽象工厂
简介
抽象工厂将工厂方法进一步抽象。定义了一个接口用于创建相关或有依赖关系的产品簇,而无需指明具体的类。可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展
工厂方法与抽象工厂方法的区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个
在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式
- AbstractFactory:抽象工厂,定义创建系列产品对象的操作接口
- ConcreteFactory:具体的工厂,实现抽象工厂定义的方法,具体实现系列产品对象的创建
- AbstractProduct:产品对象接口
- Product:实现产品对象接口的实现类
实现
- 抽象产品接口
-
public interface AbstractProductA { void productA(); }
-
public interface AbstractProductB { void productB(); }
-
- 抽象产品的实现子类
- 抽象产品A的子类
-
public class ProductA1 implements AbstractProductA{ @Override public void productA() { System.out.println("This is product A1"); } }
-
public class ProductA2 implements AbstractProductA{ @Override public void productA() { System.out.println("This is product A2"); } }
-
- 抽象产品B的子类
-
public class ProductB1 implements AbstractProductB{ @Override public void productB() { System.out.println("This is product B1"); } }
-
public class ProductB2 implements AbstractProductB{ @Override public void productB() { System.out.println("This is product B2"); } }
-
- 抽象产品A的子类
- 抽象工厂接口
-
public interface AbstractFactory { AbstractProductA createProductA(); AbstractProductB createProductB(); }
-
- 抽象工厂的子工厂
-
子工厂1
-
public class ConcreteFactory1 implements AbstractFactory{ @Override public AbstractProductA createProductA() { return new ProductA1(); } @Override public AbstractProductB createProductB() { return new ProductB1(); } }
-
- 子工厂2
-
public class ConcreteFactory2 implements AbstractFactory{ @Override public AbstractProductA createProductA() { return new ProductA2(); } @Override public AbstractProductB createProductB() { return new ProductB2(); } }
-
-
- 测试
-
public class Test { public static void main(String[] args) { ConcreteFactory1 factory1 = new ConcreteFactory1(); factory1.createProductA().productA(); factory1.createProductB().productB(); } }
This is product A1 This is product B1
-
优势和缺点
优势:抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理
缺点:假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的
应用场景
- 系统中有多于一个的产品族,而每次只使用其中某一产品族
- DAO层支持多种类型的数据库,动态切换时
- 不同操作系统代码差异化,可以切换不同操作系统时
Java 中应用实例
核心 Java 程序库的一些示例:
-
javax.xml.transform.TransformerFactory#newInstance()
识别方法: 我们可以通过方法来识别该模式——其会返回一个工厂对象。 接下来, 工厂将被用于创建特定的子组件
参考
https://developer.aliyun.com/article/238431#slide-3
https://blog.csdn.net/daidaineteasy/article/details/81067627
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南