为了解决什么问题?
抽象工厂模式目的在于提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
这种模式特别适用于那些产品族的构建过程中,当产品族中多个对象被设计在一起工作时,确保客户端始终只使用同一个产品族中的对象。
怎么用代码实现?
下面是Java代码示例,先定义抽象产品和抽象工厂:
interface Button {
void paint();
}
interface Checkbox {
void paint();
}
interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
然后定义具体的“Win”产品和工厂:
class WinButton implements Button {
public void paint() {
System.out.println("Windows Button");
}
}
class WinCheckbox implements Checkbox {
public void paint() {
System.out.println("Windows Checkbox");
}
}
class WinFactory implements GUIFactory {
public Button createButton() {
return new WinButton();
}
public Checkbox createCheckbox() {
return new WinCheckbox();
}
}
以及具体的“Mac”产品和工厂:
class MacButton implements Button {
public void paint() {
System.out.println("Mac Button");
}
}
class MacCheckbox implements Checkbox {
public void paint() {
System.out.println("Mac Checkbox");
}
}
class MacFactory implements GUIFactory {
public Button createButton() {
return new MacButton();
}
public Checkbox createCheckbox() {
return new MacCheckbox();
}
}
在创建产品时,依赖抽象工厂,而不是具体的工厂:
public class Application {
private Button button;
private Checkbox checkbox;
public Application(GUIFactory factory) {
button = factory.createButton();
checkbox = factory.createCheckbox();
}
public void paint() {
button.paint();
checkbox.paint();
}
}
为什么可以解决这个问题?
抽象工厂模式通过将具体的产品创建逻辑委托给具体工厂类的方法来解决这个问题。通过这种方式,客户端代码只需依赖于抽象工厂和产品的接口,而无需关心具体的产品类。
这样一来,当新增或替换产品族时,只需提供一个新的具体工厂实现,客户端代码无需改动,从而达到解耦合和易于扩展的目的。
抽象工厂模式适用于哪些场景?
抽象工厂模式适用于这些场景:
用户界面组件库:不同操作系统提供不同风格的UI组件,如Windows和MacOS风格的按钮、复选框等。使用抽象工厂模式可以根据运行时的环境创建一致的UI组件集合。
跨数据库支持:应用程序可能需要支持多种数据库(如MySQL、PostgreSQL等),抽象工厂可以用来创建与数据库对应的连接、命令和记录集,而不依赖于特定数据库的实现。
测试和模拟对象的创建:在测试环境下,系统可能需要使用模拟对象而不是实际的对象,抽象工厂模式可以在测试时切换使用模拟的工厂实现以返回模拟对象。
抽象工厂模式在开源代码中比较常见,下面是一些经典的应用案例:
Spring Framework:在Spring中,BeanFactory接口充当抽象工厂模式的角色,允许创建不同类型的bean,而具体的ApplicationContext实现可以看做是具体的工厂实现。
Apache Commons DBUtils:在这个库中,QueryRunner类可以配合不同的ResultSetHandler实现来创建用于不同目的的数据库查询结果。
MyBatis:在MyBatis中,SqlSessionFactory用于创建SqlSession,后者可用于执行映射的SQL操作。这里SqlSessionFactory就是一个抽象工厂,它可以产生适应不同数据库的SqlSession。
———————————这是分割线———————————
欢迎添加博主vx深入交流: