抽象工厂(Abstract Factory)提供了一种方式,可以将一组具有相同主题的单独工厂分装起来,使用中只需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。
示例
- 定义一个抽象工厂类提供包括多种产品的摄影服务,如拍摄证件照
CertificatePhoto
、拍摄婚纱照WeddingPhoto
。
public interface AbstractFactory {
CertificatePhoto certificatePhoto();
WeddingPhoto weddingPhoto();
}
public interface CertificatePhoto {
// 方法略
}
public interface WeddingPhoto {
// 方法略
}
- 有两家影棚,其中一家提供出国证件照和欧式婚纱照摄影服务。
public class Factory1 implements AbstractFactory {
@Override
public CertificatePhoto certificatePhoto() {
return new VisaCertificatePhoto();
}
@Override
public WeddingPhoto weddingPhoto() {
return new EuropeanWeddingPhoto();
}
}
public class VisaCertificatePhoto implements CertificatePhoto {
// 方法略
}
public class EuropeanWeddingPhoto implements WeddingPhoto {
// 方法略
}
- 另一家影棚提供学位证件照和中式婚纱照摄影服务。
public class Factory2 implements AbstractFactory {
@Override
public CertificatePhoto certificatePhoto() {
return new DegreeCertificatePhoto();
}
@Override
public WeddingPhoto weddingPhoto() {
return new ChineseWeddingPhoto();
}
}
public class DegreeCertificatePhoto implements CertificatePhoto {
// 方法略
}
public class ChineseWeddingPhoto implements WeddingPhoto {
// 方法略
}
- 使用第一个影棚提供的产品服务。
public static void main(String[] args) {
AbstractFactory factory = new Factory1();
CertificatePhoto certificatePhoto = factory.certificatePhoto();
// 调用 certificatePhoto 具体实现方法
WeddingPhoto weddingPhoto = factory.weddingPhoto();
// 调用 weddingPhoto 具体实现方法
}
如果想使用第二个影棚提供的产品服务只需要将new Factory1()
修改成new Factory2()
。
以上代码只引用了产品接口CertificatePhoto
和WeddingPhoto
,未引用任何实际的产品实现。如果将创建工厂实例的代码放到AbstractFactory
中,则连实际的工厂都屏蔽了。
public interface AbstractFactory {
CertificatePhoto certificatePhoto();
WeddingPhoto weddingPhoto();
public static AbstractFactory createFactory(String name) {
if (name.equalsIgnoreCase("factory1")) {
return new Factory1();
}
if (name.equalsIgnoreCase("factory2")) {
return new Factory2();
}
throw new IllegalArgumentException("Illegal factory name.");
}
}