一、定义
多个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;每个具体工厂类可创建多个具体产品类的实例。即提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体的类。意图是运入创建一族相关或者是相互依赖的对象。假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构。那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式。这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品。
二、结构图
通过使用抽象工厂模式,可以处理具有相同(或者相似)等级结构中的多个产品族中的产品对象的创建问题。如下图所示:
由于这两个产品族的等级结构相同,因此使用同一个工厂族也可以处理这两个产品族的创建问题,这就是抽象工厂模式。根据产品角色的结构图,就不难给出工厂角色的结构设计图。
可以看出,每一个工厂角色都有两个工厂方法,分别负责创建分属不同产品等级结构的产品对象。
三、应用程序
(1)抽象产品及其具体产品
public abstract class CPU {
public abstract void describeCPU();
}
public class IntelCPU extends CPU {
@Override
public void describeCPU() {
System.out.println("The is a IntelCPU...");
}
}
public class AmdCPU extends CPU {
@Override
public void describeCPU() {
System.out.println("The is a AmdCPU...");
}
}
public abstract class MainBoard {
public abstract void displayMainBoard();
}
public class IntelMainBoard extends MainBoard {
@Override
public void displayMainBoard() {
System.out.println("The is a IntelMainBoard...");
}
}
public class AmdMainBoard extends MainBoard {
@Override
public void displayMainBoard() {
System.out.println("The is a AmdMainBoard...");
}
}
(2)抽象工厂及其具体工厂
public abstract class AbstractFactory {
public abstract CPU createCPU();
public abstract MainBoard createMainBoard();
}
public class AmdFactory extends AbstractFactory {
@Override
public CPU createCPU() {
return new AmdCPU();
}
@Override
public MainBoard createMainBoard() {
return new AmdMainBoard();
}
}
public class IntelFactory extends AbstractFactory {
@Override
public CPU createCPU() {
return new IntelCPU();
}
@Override
public MainBoard createMainBoard() {
return new IntelMainBoard();
}
}
(3)客户端代码
public class Client {
public static void main(String[] args) {
// 使用Intel的设备
AbstractFactory IntelFactory = new IntelFactory();
CPU IntelCPU = IntelFactory.createCPU();// Intel的CPU
MainBoard IntelMainBoard = IntelFactory.createMainBoard();// Intel的主板
IntelCPU.describeCPU();
IntelMainBoard.displayMainBoard();
System.out.println("********************************");
// 使用Amd的设备
AbstractFactory AmdFactory= new AmdFactory();
CPU AmdCPU = AmdFactory.createCPU();// Amd的CPU
MainBoard AmdMainBoard = AmdFactory.createMainBoard();// Amd的主板
AmdCPU.describeCPU();
AmdMainBoard.displayMainBoard();
}
}
运行结果:
The is a IntelCPU...
The is a IntelMainBoard...
********************************
The is a AmdCPU...
The is a AmdMainBoard...
四、应用环境
1.一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
2.这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
3.同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
4.系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
五、抽象工厂模式优缺点
1、优点
(1)分离接口和实现:客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
(2)使切换产品族变得容易:因为一个具体的工厂实现代表的是一个产品族。
2、缺点
不太容易扩展新的产品:如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。
注意:
抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。