看抽象方法模式之前,最好看看工厂方法模式。当成品种类越来越多,并且产品有越来越多系列的时候,工厂方法模式就有点力不从心了,按照示例中动物有猫狗,猫狗下有猫粮狗粮,当要是猫吃猫粮的时候,就需要获取猫工厂、猫粮工厂,如果不小心获取到猫工厂、狗粮工厂,那么就会出错。
为了优化这个问题,当一个类别的产品有多个系列区分的时候,为了按照系列生产商品,那么就需要用抽象工厂进行区分。即将猫与口粮的映射关系放到抽象工厂中。
示例
假设新增了猫粮狗粮,那么根据工厂方法模式需要新增猫、狗粮工厂
public interface FoodFactory {
Food getFood();
}
public class DogFoodFactory implements FoodFactory {
@Override
public Food getFood() {
return new DogFood();
}
}
public class CatFoodFactory implements FoodFactory{
@Override
public Food getFood() {
return new CatFood();
}
}
工厂方法中,当猫要吃猫粮的时候,需要获取两次工厂,有可能获取到错误的工厂
public class Test {
public static void main(String[] args) {
AnimalFactory catFactory = new CatFactory();
catFactory.getAnimal();
// 例如这里本来要获取猫粮结果获取到了狗粮
FoodFactory dogFoodFactory = new DogFoodFactory();
dogFoodFactory.getFood();
}
}
为了避免上述情况产生,需要将猫和猫粮进行绑定
public abstract class AbstractFactory {
abstract Animal getAnimal();
abstract Food getFood();
}
public class CatFactory extends AbstractFactory{
@Override
Animal getAnimal() {
return new Cat();
}
@Override
Food getFood() {
return new Food();
}
}
测试
public class Test {
public static void main(String[] args) {
AbstractFactory catFactory = new CatFactory();
catFactory.getAnimal();
catFactory.getFood();
}
}