GoF Definition 定义:提供一个接口,以创建一系列相关的对象,而无需指定他们的具体实类( Provides an interface for creating families of related or dependent objects without specifying their concrete classes).
之前提到过听起来差不多的工厂模式(factory pattern),两者的区别在于:工厂模式定义了一个具体的工厂,这个工厂提供统一的接口,返回一系列相似的产品。而抽象工厂方法返回一个“工厂”,再通过这个工厂得到具体产品。抽象工厂模式比工厂模式多了一层,可以理解为“工厂的工厂”。而在作用上说,无论是工厂方法,还是抽象工厂方法,都是为了将用户接口和具体实现分离开来。
从另一个层面讲,工厂方法是提供了一级索引:工厂->产品。抽象工厂是两级索引:抽象工厂-> 具体工厂 -> 产品。
举一个具体的例子来说明抽象工厂模式。在贸易全球化时代,很少有公司能百分比自己生产一个产品,部分组件直接从供应商买就行了。例如制造一台手机,需要CPU、屏幕、电池、摄像头等部件。但手机厂商完全不需要自己设计生成这些零件,只需要写一个零件的需求规格说明,然后找供应商谈就行了。将这些组件排列组合,最后就能发布一系列产品了。
下面用代码来描述这个例子。
/**
* Abstract Factory method patterns
*/
public class Main {
public static void main(String[] args) {
System.out.println("HighEndPhone-------\n");
ICellPhoneFactory gaoDuanShouJi = new HighEndPhoneFactory();
gaoDuanShouJi.getCpu().getCpuInfo();
gaoDuanShouJi.getScreen().getScreenInfo();
System.out.println("LowEndPhone--------\n");
ICellPhoneFactory diDuanShouJi = new LowEndPhoneFactory();
diDuanShouJi.getCpu().getCpuInfo();
diDuanShouJi.getScreen().getScreenInfo();
}
}
// 定义屏幕零件的标准
abstract class IScreen {
protected float size = 0;
protected String producer = "";
public void getScreenInfo() {
System.out.printf("Screen: made by %s, size = %.1f inch\n", producer, size);
}
}
// 定义cpu的标准
abstract class ICpu {
protected float freq = 0;
protected String baseBand = "";
protected String producer = "";
public void getCpuInfo() {
System.out.printf("CPU: %s CPU, made by %s, frequency is %.2f Ghz\n", baseBand, producer, freq);
}
}
// 生产手机的抽象工厂
abstract class ICellPhoneFactory {
abstract IScreen getScreen();
abstract ICpu getCpu();
}
// 某通cpu的具体实现
class QualcommCpu extends ICpu {
QualcommCpu() {
freq = 3.0f;
baseBand = "5G";
producer = "Qualcomm";
}
}
// 发哥cpu的具体实现
class MediaTekCpu extends ICpu {
MediaTekCpu() {
freq = 3.5f;
baseBand = "4G";
producer = "MediaTek";
}
}
// JDI屏幕的具体实现
class JDIScreen extends IScreen {
JDIScreen() {
size = 6.7f;
producer = "JDI";
}
}
// SHARP屏幕的具体实现
class SharpScreen extends IScreen {
SharpScreen() {
size = 6.5f;
producer = "SHARP";
}
}
// 具体工厂的实现,生产高端手机型号
class HighEndPhoneFactory extends ICellPhoneFactory {
@Override
IScreen getScreen() {
return new SharpScreen();
}
@Override
ICpu getCpu() {
return new QualcommCpu();
}
}
// 第二个具体工厂的实现,生产中端手机型号
class LowEndPhoneFactory extends ICellPhoneFactory {
@Override
IScreen getScreen() {
return new JDIScreen();
}
@Override
ICpu getCpu() {
return new MediaTekCpu();
}
}
运行结果: