美文网首页
创建型设计模式(三)抽象工厂

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

作者: 又语 | 来源:发表于2021-11-13 11:01 被阅读0次

抽象工厂(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.");
    }
}

相关文章

网友评论

      本文标题:创建型设计模式(三)抽象工厂

      本文链接:https://www.haomeiwen.com/subject/fjcpzltx.html