抽象工厂模式是一种经典的面向对象设计模式,常用于软件设计中的对象创建部分。这种模式将创建对象的方法抽象化,使得在一个应用程序中可以轻松地创建一整套相关或相互依赖的对象,这些对象有专门的使用场景。接下来将从多个角度对抽象工厂模式进行分析。
1.模式定义
抽象工厂模式的定义是:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。抽象工厂模式属于创建型模式的一种,将类的实例化过程推迟到子类中完成。
2.模式结构
通常来说,抽象工厂模式具有四个重要的部分,分别是:
AbstractFactory(抽象工厂):声明创建一组产品对象的接口。
ConcreteFactory(具体工厂):实现创建具体产品对象的操作。
AbstractProduct(抽象产品):声明一类产品对象的接口。
ConcreteProduct(具体产品):定义具体工厂生产的具体产品对象,并实现抽象产品接口。
具体的结构图如下所示:

3.模式举例
用一个简单的例子来说明抽象工厂模式的运作,假设有一个订单系统需要处理两种不同的订单类型,分别是普通订单和VIP订单,而这两种订单类型所涉及的商品种类不同,普通订单有A、B、C三种商品,而VIP订单有X、Y、Z三种商品。现在需求是需要一个订单工厂来创建不同种类的订单对象。这时候就可以使用抽象工厂模式。
首先,定义一个抽象工厂类OrderFactory,其中包含两个抽象方法createNormalOrder()和createVipOrder(),用于生产不同类型的订单对象。
```java
public abstract class OrderFactory {
public abstract Order createNormalOrder();
public abstract Order createVipOrder();
}
```
接着定义两个具体工厂类,即NormalOrderFactory和VipOrderFactory,分别实现上述两个方法,用于创建具体的订单对象。
```java
public class NormalOrderFactory extends OrderFactory {
public Order createNormalOrder() {
return new NormalOrder();
}
public Order createVipOrder() {
return new VipOrder();
}
}
public class VipOrderFactory extends OrderFactory {
public Order createNormalOrder() {
return new VipNormalOrder();
}
public Order createVipOrder() {
return new VipVipOrder();
}
}
```
最后,定义抽象产品类Order和具体产品类NormalOrder、VipOrder、VipNormalOrder和VipVipOrder,其中前两个用于普通订单,后两个用于VIP订单。
```java
public abstract class Order {
public abstract void printOrder();
}
public class NormalOrder extends Order {
public void printOrder() {
System.out.println("This is a normal order.");
}
}
public class VipOrder extends Order {
public void printOrder() {
System.out.println("This is a VIP order.");
}
}
public class VipNormalOrder extends Order {
public void printOrder() {
System.out.println("This is a VIP normal order.");
}
}
public class VipVipOrder extends Order {
public void printOrder() {
System.out.println("This is a VIP VIP order.");
}
}
```
这样,就可以使用不同的工厂,创建不同类型的订单对象:
```java
OrderFactory factory = new NormalOrderFactory();
Order normalOrder = factory.createNormalOrder();
Order vipOrder = factory.createVipOrder();
normalOrder.printOrder(); // This is a normal order.
vipOrder.printOrder(); // This is a VIP order.
factory = new VipOrderFactory();
normalOrder = factory.createNormalOrder();
vipOrder = factory.createVipOrder();
normalOrder.printOrder(); // This is a VIP normal order.
vipOrder.printOrder(); // This is a VIP VIP order.
```
4.模式优缺点
抽象工厂模式具有以下优点:
1)易于扩展:增加新的抽象产品或具体产品是比较容易的,只需要新增对应的工厂和产品即可。
2)屏蔽细节:使用抽象工厂模式可以屏蔽细节,客户端只需要知道接口,而不用关心具体实现方式。
3)多样性:可以创建一系列相互关联的对象,而且可以在一次调用中返回这些对象。
抽象工厂模式也存在以下缺点:
1)不易扩展新品种:增加新品种的产品时,需要修改工厂类的判断语句,这样会导致工厂类较复杂,不易维护。
2)不易扩展新产品族:增加新产品族时,需要新增对应的抽象工厂类和具体工厂类,这样会导致类的个数增加。
5.模式应用
抽象工厂模式常见于以下场景:
1)需要一组相关或相互依赖的对象,并且它们都有特定的使用场景。
2)系统中需要大量使用产品对象,而新增的产品种类难以预知。
3)需要屏蔽对象的创建细节,只对外提供接口。
6.
扫码咨询 领取资料