1、定义
抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
对比工厂方法模式的定义:为某个对象提供一个接口,而且无需指定它们的具体类。可以看出抽象工厂模式相当于是对工厂方法模式(https://blog.csdn.net/ss1300460973/article/details/84989514)的横向扩展,工厂方法只能创建一类接口,而抽象工厂模式可以创建多类接口,当然这些接口遵循一致需求。
工厂方法模式引入工厂等级结构,解决了简单工厂模式中工厂类职责过重的问题,但由于工厂方法模式中每个工厂只创建一类具体类的对象,这将会导致系统当中的工厂类过多,这势必会增加系统的开销。因此可以考虑将一些相关的具体类组成一个“具体类族”,由同一个工厂来统一生产,这就是抽象工厂模式的基本思想。
2、实现
创建一个食品工厂,可以生产特定水果和蔬菜:
1)创建水果类和蔬菜类,以及它们的具体类;
2)创建抽象食品工厂、食品工厂1和食品工厂2;
3)调用方创建具体的食品工厂实例。
// 服务方提供的水果类
public class Fruit {
String name;
public Fruit(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
// 一个具体的水果类
public class Apple extends Fruit {
public Apple(String name) {
super(name);
}
}
// 一个具体的水果类
public class Banana extends Fruit {
public Banana(String name) {
super(name);
}
}
// 服务方提供的蔬菜类
public class Vegetable {
String name;
public Vegetable(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
// 一个具体的蔬菜类
public class Cabage extends Vegetable{
public Cabage(String name) {
super(name);
}
}
// 一个具体的蔬菜类
public class Carrot extends Vegetable{
public Carrot(String name) {
super(name);
}
}
// 抽象工厂
public interface IFoodFactory {
public Fruit getFruit();
public Vegetable getVegetable();
}
// 工厂A
public class FoodFactoryA implements IFoodFactory{
@Override
public Fruit getFruit() {
return new Apple("apple");
}
@Override
public Vegetable getVegetable() {
return new Cabage("cabage");
}
}
// 工厂B
public class FoodFactoryB implements IFoodFactory {
@Override
public Fruit getFruit() {
return new Banana("banana");
}
@Override
public Vegetable getVegetable() {
return new Carrot("carrot");
}
}
// 调用方
public class Eat {
public static void main(String[] args) {
IFoodFactory foodFactoryA = new FoodFactoryA();
System.out.println("A get fruit :" + foodFactoryA.getFruit() +
". A get vegetable :" + foodFactoryA.getVegetable());
IFoodFactory foodFactoryB = new FoodFactoryB();
System.out.println("B get fruit :" + foodFactoryB.getFruit() +
". B get vegetable :" + foodFactoryB.getVegetable());
}
}
简单工厂、工厂方法、抽象工厂的区别: