抽象工厂模式是一种常用的软件设计模式,它属于创建型模式,主要用来解决对象创建问题。该模式提供一个抽象工厂,可以创建一系列相关的对象,而无需指定具体的类。
在抽象工厂模式中,抽象工厂是用来声明一组具有相同特征的工厂方法的接口,具体工厂则实现这些接口,从而生产出一系列相关的产品。而产品族则指由同一个工厂生产的一组产品,这些产品在某一方面具有相同的特点或者用途。
下面是抽象工厂模式的类图:

如上图所示,抽象工厂模式涉及到四种角色:
1. 抽象工厂(Abstract Factory):提供一组创建抽象产品的工厂接口,声明了一系列生产产品的方法。
2. 具体工厂(Concrete Factory):实现抽象工厂接口,用于生产一系列相关的产品。
3. 抽象产品(Abstract Product):提供了一系列产品的公共接口,其具体子类将由具体工厂来创建。
4. 具体产品(Concrete Product):实现抽象产品接口,用于客户端获取和使用。
下面是抽象工厂模式的代码实现:
```java
// 抽象产品 - 按钮
public interface Button {
void paint();
}
// 抽象产品 - 文本框
public interface TextField {
void paint();
}
// 具体产品A类 - 按钮
public class WindowsButton implements Button {
@Override
public void paint() {
System.out.println("Windows按钮");
}
}
// 具体产品A类 - 文本框
public class WindowsTextField implements TextField {
@Override
public void paint() {
System.out.println("Windows文本框");
}
}
// 具体产品B类 - 按钮
public class MacButton implements Button {
@Override
public void paint() {
System.out.println("Mac按钮");
}
}
// 具体产品B类 - 文本框
public class MacTextField implements TextField {
@Override
public void paint() {
System.out.println("Mac文本框");
}
}
// 抽象工厂
public interface GUIFactory {
Button createButton();
TextField createTextField();
}
// 具体工厂A
public class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public TextField createTextField() {
return new WindowsTextField();
}
}
// 具体工厂B
public class MacFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public TextField createTextField() {
return new MacTextField();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
// 选择具体工厂
GUIFactory factory = new WindowsFactory();
// 客户端通过具体工厂获取具体产品
Button button = factory.createButton();
TextField textField = factory.createTextField();
// 使用具体产品
button.paint();
textField.paint();
}
}
```
从代码实现中可以看到,抽象工厂模式实现了一种抽象层次,将对象的创建过程与客户端分离,使得客户端仅需根据具体的工厂去获取所需的产品。从而使得系统更加灵活,易于扩展,同时也更容易进行测试。
此外,抽象工厂模式还有以下几个特点:
1. 抽象工厂模式将一组相关的产品进行封装,可以提供一个统一的创建接口。
2. 抽象工厂模式可以在不知道具体产品类名的情况下创建产品对象。
3. 抽象工厂模式与工厂方法模式的区别在于,工厂方法模式只能生产一个具体的产品,而抽象工厂模式可以生产一组相关的产品。
综上所述,抽象工厂模式在实现了抽象层次的同时,也实现了一种开闭原则,能够方便地进行扩展。因此,它在软件开发中是一种非常常用的设计模式,尤其是在构造界面控件和创建数据库访问对象等场景下,能够帮助我们更好的实现系统的功能需求。
扫码咨询 领取资料