创建型设计模式(三)抽象工厂

抽象工厂(Abstract Factory)提供了一种方式,可以将一组具有相同主题的单独工厂分装起来,使用中只需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。

示例

  1. 定义一个抽象工厂类提供包括多种产品的摄影服务,如拍摄证件照CertificatePhoto、拍摄婚纱照WeddingPhoto
public interface AbstractFactory {

    CertificatePhoto certificatePhoto();

    WeddingPhoto weddingPhoto();
}

public interface CertificatePhoto {
    // 方法略
}

public interface WeddingPhoto {
    // 方法略
}
  1. 有两家影棚,其中一家提供出国证件照和欧式婚纱照摄影服务。
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 {
    // 方法略
}
  1. 另一家影棚提供学位证件照和中式婚纱照摄影服务。
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 {
    // 方法略
}
  1. 使用第一个影棚提供的产品服务。
public static void main(String[] args) {
    AbstractFactory factory = new Factory1();
    CertificatePhoto certificatePhoto = factory.certificatePhoto();
    // 调用 certificatePhoto 具体实现方法
    WeddingPhoto weddingPhoto = factory.weddingPhoto();
    // 调用 weddingPhoto 具体实现方法
}

如果想使用第二个影棚提供的产品服务只需要将new Factory1()修改成new Factory2()
以上代码只引用了产品接口CertificatePhotoWeddingPhoto,未引用任何实际的产品实现。如果将创建工厂实例的代码放到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.");
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容