抽象工厂(Abstract Factory Design Pattern)是一种创建型的模式,和工厂方法类似,不过抽象工厂不只创建单一品类的产品,而是可以将产品族封装起来,创建多重产品。我们可以看一下下面的这个UML类图。
抽象工厂定义了创建产品的接口
具体工厂来实现具体的产品创建的行为逻辑
接下来我们来看一下代码:
抽象产品接口:
Phone
public interface Phone {
String getName();
}
Pad
public interface Pad {
String getName();
}
具体的产品类:
小米系列
public class MiPhone implements Phone {
@Override
public String getName() {
return "小米";
}
}
public class MiPad implements Pad{
@Override
public String getName() {
return "MiPad";
}
}
华为系列
public class HuaweiPhone implements Phone{
@Override
public String getName() {
return "华为";
}
}
public class HuaweiPad implements Pad{
@Override
public String getName() {
return "HuaweiPad";
}
}
然后是抽象的工厂接口:
public interface AbstractFactory {
Phone createPhone();
Pad createPad();
}
小米工厂:
public class MiConcreteFactory implements AbstractFactory {
@Override
public Phone createPhone() {
return new MiPhone();
}
@Override
public Pad createPad() {
return new MiPad();
}
}
华为工厂:
public class HuaweiConcreteFactory implements AbstractFactory {
@Override
public Phone createPhone() {
return new HuaweiPhone();
}
@Override
public Pad createPad() {
return new HuaweiPad();
}
}
client端测试:
public class ClientDemo {
public static void main(String[] args) {
AbstractFactory miFactory = new MiConcreteFactory();
Phone miPhone = miFactory.createPhone();
Pad miPad = miFactory.createPad();
System.out.println(miPhone.getName());
System.out.println(miPad.getName());
AbstractFactory huaweiFactory = new HuaweiConcreteFactory();
Phone huaweiPhone = huaweiFactory.createPhone();
Pad huaweiPad = huaweiFactory.createPad();
System.out.println(huaweiPhone.getName());
System.out.println(huaweiPad.getName());
}
}
打印输出:
小米
MiPad
华为
HuaweiPad
以上代码的UML图如下所示:
我们可以看到抽象工厂和简单工厂与工厂方法相比,能够创建出不同类型的产品,但是如果想让抽象工厂创建出Oppo品牌的Phone和Pad,那么必须要新增加产品族,以及Oppo产品族的具体工厂。
参考文章:https://www.geeksforgeeks.org/abstract-factory-pattern/
来源:oschina
链接:https://my.oschina.net/mingshashan/blog/3189803