抽象工厂 Abstract Factory
抽象工厂定义
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂类图
-
AbstractFactory:抽象工厂,定义创建一系列产品对象的操作接口。
-
ConcreteFactory:具体的工厂,实现抽象工厂定义的方法,具体实现一系列产品对象的创建。
-
AbstractProduct:定义一类产品对象的接口。
-
ConcreteProduct:具体的产品实现对象,通常在具体工厂里面,会选择具体的产品实现对象,来创建符合抽象工厂定义的方法返回的产品类型的对象。
-
Client:客户端,主要使用抽象工厂来获取一系列所需要的产品对象,然后面向这些产品对象的接口编程,以实现需要的功能。
抽象工厂代码实现
-
先看看抽象工厂的定义,示例代码如下:
public interface AbstractFactory { AbstractProductA createProductA(); AbstractProductB createProductB(); }
-
接下来看看产品的定义,示例代码如下:
public interface AbstractProductA { void executeA(String word); } public interface AbstractProductB { void executeB(String word); }
-
具体产品的实现,示例代码如下:
public class ProductA1 implements AbstractProductA { @Override public void executeA(String word) { System.out.println("a1 say " + word); } } public class ProductA2 implements AbstractProductA { @Override public void executeA(String word) { System.out.println("a2 say " + word); } } public class ProductB1 implements AbstractProductB { @Override public void executeB(String word) { System.out.println("b1 say " + word); } } public class ProductB2 implements AbstractProductB { @Override public void executeB(String word) { System.out.println("b2 say " + word); } }
-
接下来看看具体的工厂的实现示意,示例代码如下:
public class ConcreteFactory1 implements AbstractFactory { @Override public AbstractProductA createProductA() { return new ProductA1(); } @Override public AbstractProductB createProductB() { return new ProductB1(); } } public class ConcreteFactory2 implements AbstractFactory { @Override public AbstractProductA createProductA() { return new ProductA2(); } @Override public AbstractProductB createProductB() { return new ProductB2(); } }
-
一般客户端不会直接使用抽象工厂,一般会加工一下,示例代码如下:
public class Pack { private AbstractProductA productA; private AbstractProductB productB; public Pack(AbstractFactory factory){ this.productA = factory.createProductA(); this.productB = factory.createProductB(); } public void execute(String word){ productA.executeA(word); productB.executeB(word); } }
-
最后来看看客户端的实现示意,示例代码如下:
public class Client { public static void main(String[] args) { AbstractFactory factory = new ConcreteFactory1(); Pack outSide = new Pack(factory); outSide.execute("abstract_factory"); } }
抽象工厂的思考
抽象工厂的本质
抽象工厂的本质是选择产品簇实现。
何时选择抽象工厂
1. 如果希望一个系统独立于它的产品的创建,组合和表示的时候,换句话说,希望一个系统只是知道产品的接口,而不关心实现的时候。
2. 如果一个系统要由多个产品系列中的一个来配置的时候,换句话说,就是可以动态的切换产品簇的时候。
3. 如果要强调一系列相关产品的接口,以便联合使用它们的时候。
抽象工厂的优缺点
优点
1. 分离接口和实现
2. 使得切换产品簇变得容易
缺点
1. 不太容易扩展新的产品
2. 容易造成类层次复杂
体现了设计模式中的哪些原则
-
“开闭原则”的倾斜行
如果只增加新的产品簇,抽象工厂能很好的支持开闭原则
如果增加新的产品结构,抽象工厂需要修改所有的工厂和抽象工厂
抽象工厂相关模式
抽象工厂模式和工厂方法模式
这两个模式既有区别,又有联系,可以组合使用。
工厂方法模式一般是针对单独的产品对象的创建,而抽象工厂模式注重产品簇对象的创建,这是它们的区别。
如果把抽象工厂创建的产品簇简化,这个产品簇就只有一个产品,那么这个时候的抽象工厂跟工厂方法是差不多的,也就是抽象工厂可以退化成工厂方法,而工厂方法又可以退化成简单工厂,这是它们的联系。
在抽象工厂的实现中,还可以使用工厂方法来提供抽象工厂的具体实现,也就是说它们可以组合使用。
抽象工厂模式和单例模式
这两个模式可以组合使用。
在抽象工厂模式里面,具体的工厂实现,在整个应用中,通常一个产品系列只需要一个实例就可以了,因此可以把具体的工厂实现成为单例。
【推荐】国内首个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代理技术深度解析与实战指南