简介
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
抽象工厂模式是基于工厂模式的,工厂模式要求具体产品和具体工厂一一对应,并且,每一个工厂只能创建一大类产品,抽象工厂打破了这一关系,即某一个具体工厂可以生产多个不同类的产品,如下:
因此,工厂模式和简单工厂模式的关系可以概括为,工厂模式能生产多类产品就变成了抽象工厂模式,抽象工厂模式如果只能生产一类产品,那就变成了工厂模式。
类图
这个类图和工厂模式的类图最大的区别就是新增加了一类产品,其他都一样。
代码实现
示例:狼和狮子是食肉动物,角马和野牛是食草动物,非洲有角马和狮子,美洲有野牛和狼,通过非洲工厂生产角马和狮子,通过美洲工厂生产野牛和狼。
首先是食草动物类:
//食草动物
public interface Herbivore {
public void print();
}
//角马
class Wildebeest implements Herbivore{
@Override
public void print() {
// TODO Auto-generated method stub
System.out.println("我是一头角马,我吃草!");
}
}
//野牛
class Bison implements Herbivore{
@Override
public void print() {
// TODO Auto-generated method stub
System.out.println("我是一头野牛,我吃草!");
}
}
然后是食肉动物:
//食肉动物
public interface Carnivores {
public void print();
}
//狼
class Wolf implements Carnivores{
@Override
public void print() {
// TODO Auto-generated method stub
System.out.println("我是一头狼,我吃肉!");
}
}
//狮子
class Lion implements Carnivores{
@Override
public void print() {
// TODO Auto-generated method stub
System.out.println("我是一头狮子,我吃肉!");
}
}
然后是工厂类,分别有非洲工厂和美洲工厂:
public interface Factory {
public Herbivore createH();
public Carnivores createC();
}
//非洲工厂
class AfricaFactory implements Factory{
@Override
public Herbivore createH() {
return new Wildebeest();
}
@Override
public Carnivores createC() {
return new Lion();
}
}
//美洲工厂
class AmericaFactory implements Factory{
@Override
public Herbivore createH() {
return new Bison();
}
@Override
public Carnivores createC() {
return new Wolf();
}
}
最后是客户端类,发出需求:
public class Client {
public static void main(String[] args) {
System.out.println("我需要美洲的动物:");
//需要美洲的动物
AmericaFactory americaFactory = new AmericaFactory();
Bison bison = (Bison) americaFactory.createH();
bison.print();
Wolf wolf = (Wolf) americaFactory.createC();
wolf.print();
System.out.println("\n我需要非洲的动物:");
//需要非洲的动物
AfricaFactory africaFactory = new AfricaFactory();
Wildebeest wildebeest = (Wildebeest) africaFactory.createH();
wildebeest.print();
Lion lion = (Lion) africaFactory.createC();
lion.print();
}
}
结果:
抽象工厂模式和简单工厂模式相似,也不符合开闭原则,新增产品时需要修改核心工厂类。