概述
抽象工厂模式是是对象的创建模式,它是工厂方法模式的进一步抽象和推广。当需要创建的实例来自于多个产品结构,且每个产品结构中的产品都存在相似的情况,就要用到抽象工厂模式。
抽象工厂模式与工厂方法模式的最大区别在于,工厂方法模式针对的是一个产品结构,而抽象工厂模式则针对的是多个产品结构。
如下图,有两个产品结构ProductA、ProductB,它们中的产品两两相似,那么ProductA1与ProductB1可以称为一个产品族,ProductA2和ProductB2可以称为一个产品族。
如下图,抽象工厂模式涉及四个角色:
1)抽象工厂:这是抽象工厂模式的核心,它与应用程序无关。任何在该模式中创建对象的工厂类必须实现这个接口或继承这个抽象类。
2)具体工厂:实现了抽象工厂的具体类,用来创建产品对象。
3)抽象产品:是由抽象工厂模式所创建的对象的父类或接口。抽象产品可以用一个Java接口或者Java抽象类实现。
4)具体产品:抽象工厂模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java类实现。
系统设计
为了更好的理解,这里通过抽象工厂模式在农场系统中的实现来说明。
农场系统中分为两个产品结构,水果(Fruit)和蔬菜(Veggie),而水果和蔬菜的种植有两种方式 :普通种植和大棚热带种植。那么普通种植为一个产品族,大棚热带种植为一个产品族。系统的设计图如下图:
代码实现
/* 水果产品 */
public interface Fruit {
}
/* 普通水果 */
public class NormalFruit implements Fruit {
public NormalFruit() {}
}
/* 热带水果 */
public class TropicalFruit implements Fruit {
public TropicalFruit() {}
}
/* 蔬菜产品 */
public interface Veggie {
}
/* 普通蔬菜 */
public class NormalVeggie implements Veggie {
public NormalVeggie() {}
}
/* 热带蔬菜 */
public class TropicalVeggie implements Veggie {
public TropicalVeggie() {}
}
/* 抽象工厂 */
public interface Creator {
public Fruit createFruit();
public Veggie createVeggie();
}
/* 具体工厂 */
public class NormalCreator implements Creator {
public Fruit createFruit() {
return new NormalFruit();
}
public Veggie createVeggie() {
return new NormalVeggie();
}
}
public class TropicalCreator implements Creator {
public Fruit createFruit() {
return new TropicalFruit();
}
public Veggie createVeggie() {
return new TropicalVeggie();
}
}