抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
先看一下工厂模式
1. 工厂模式
定义一个用于创建对象的接口,让子类决定实例化那个类。工厂方法使一个类的实例化延迟到子类。
有2个接口,一个是工厂接口,一个是生产的产品接口
工厂A,工厂B都属于工厂接口具体的实现类
工厂A生产产品A
工厂B生产产品B
产品A和产品B都属于产品接口具体的实现类
如果想生产产品C,可以新增一个工厂C实现工厂接口,不用修改工厂接口内部的代码,符合开闭原则,对内修改关闭,对外修改开放。
可以参考下面的类图

public class FactoryPattern {
public static void main(String[] args) {
Factory factory = new HuaWeiFactory();
Phone phone = factory.createPhone();
phone.print();
}
}
interface Phone {
void print();
}
class iPhone implements Phone {
@Override
public void print() {
System.out.print("iPhone");
}
}
class HuaWeiPhone implements Phone {
@Override
public void print() {
System.out.print("HuaWeiPhone");
}
}
interface Factory {
Phone createPhone();
}
class IPhoneFactory implements Factory {
@Override
public Phone createPhone() {
return new iPhone();
}
}
class HuaWeiFactory implements Factory {
@Override
public Phone createPhone() {
return new HuaWeiPhone();
}
}
2. 抽象工厂模式
工厂模式是一对一的关系,即一个工厂只能生产一类产品,抽象工厂模式打破了这种一对一的关系,可以是一对多的关系,即一个工厂可以生产多类产品。
抽象工厂模式只是工厂模式的一个扩展,抽象工厂模式如果只有一个产品体系就会退化成工厂模式


public class AbstractFactoryPattern {
public static void main(String[] args) {
SuperFactory factory = new SuperFactory();
Phone phone = factory.createPhone("1");
phone.print();
}
}
interface Phone {
void print();
}
class iPhone implements Phone {
@Override
public void print() {
System.out.print("iPhone");
}
}
class HuaWeiPhone implements Phone {
@Override
public void print() {
System.out.print("HuaWeiPhone");
}
}
interface Mask {
void print();
}
class N95 implements Mask {
@Override
public void print() {
System.out.print("N95");
}
}
class KN95 implements Mask {
@Override
public void print() {
System.out.print("KN95");
}
}
interface AbstractFactory {
Phone createPhone(String param);
Mask createMask(String param);
}
class SuperFactory implements AbstractFactory {
@Override
public Phone createPhone(String param) {
return new iPhone();
}
@Override
public Mask createMask(String param) {
return new N95();
}
}