抽象工厂模式
工厂方法模式可以进一步优化,提取出工厂接口。
/**
* @Author: mahy
* @Contact: [email protected]
* @Date: 2022-03-07 15:20
* @Description: 动物工厂接口
*/
public interface AniFactory {
/**
* 创建动物
* @return
*/
Animal create();
}
/**
* @Author: mahy
* @Contact: [email protected]
* @Date: 2022-03-07 15:11
* @Description: 猫实现动物接口的实现类
*/
public class CatFactory implements AniFactory{
@Override
public Animal create(){
return new Cat();
}
}
/**
* @Author: mahy
* @Contact: [email protected]
* @Date: 2022-03-07 15:10
* @Description: 狗实现动物接口的实现类
*/
public class DogFactory implements AniFactory{
@Override
public Animal create(){
return new Dog();
}
}
/**
* @Author: mahy
* @Contact: [email protected]
* @Date: 2022-03-07 14:02
* @Description: 测试抽象工厂方法
*/
public class Test001 {
public static void main(String[] args) {
AniFactory catFactory = new CatFactory();
Animal cat = catFactory.create();
AniFactory dogFactory = new DogFactory();
Animal dog = dogFactory.create();
String dogSleep = dog.sleep();
String catSleep = cat.sleep();
System.out.println(dogSleep); //狗在睡觉
System.out.println(catSleep); //猫在睡觉
}
}
可以看到,我们在创建时指定了具体的工厂类后,在使用时就无需再关心是哪个工厂类,只需要将此工厂当作抽象的 AniFactory
接口使用即可。这种经过抽象的工厂方法模式被称作抽象工厂模式。
抽象工厂模式很好的发挥了开闭原则、依赖倒置原则,但缺点是抽象工厂模式太重了,如果 AniFactory
接口需要新增功能,则会影响到所有的具体工厂类。使用抽象工厂模式,替换具体工厂时只需更改一行代码,但要新增抽象方法则需要修改所有的具体工厂类。所以抽象工厂模式适用于增加同类工厂这样的横向扩展需求,不适合新增功能这样的纵向扩展。