工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。在工厂方法模式中用户只需要关心所需产品对应的工厂,无须关心创建细节,而且加入新的产品符合开闭原则。 工厂方法模式主要解决产品扩展的问题,在简单工厂中,随着产品链的丰富,如果每个课程的创建逻辑有区别的话,工厂的职责会变得越来越多,有点像万能工厂,并不便于维护。根据单一职责原则我们将职能继续拆分,专人做专事。
抽象工厂
public interface IAnimalFactory {
IAnimal create();
}
具体工厂
public class FlyAnimalFactory implements IAnimalFactory {
//实例工厂来创建对象
public IAnimal create() {
return new FlyAnimal();
}
}
public class SwingAnimalFactory implements IAnimalFactory {
//实例工厂来创建对象
public IAnimal create() {
return new SwingAnimal();
}
}
抽象类
public interface IAnimal {
void animalInfo();
}
实现类
public class FlyAnimal implements IAnimal{
public void animalInfo() {
System.out.println("我是会飞的动物!");
}
}
public class SwingAnimal implements IAnimal{
public void animalInfo() {
System.out.println("我是会游泳的动物!");
}
}
测试类
public class Test {
public static void main(String[] args) {
IAnimalFactory flyAnimalFactory = new FlyAnimalFactory();
IAnimal fly = flyAnimalFactory.create();
fly.animalInfo();
// 符合开闭原则,工厂方法对扩展支持,对修改关闭
IAnimalFactory swingAnimalFactory = new SwingAnimalFactory();
IAnimal swing = swingAnimalFactory.create();
swing.animalInfo();
}
}
工厂方法适用于以下场景:
1、创建对象需要大量重复的代码。
2、客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。
3、一个类通过其子类来指定创建哪个对象。
工厂方法也有缺点:
1、类的个数容易过多,增加复杂度。
2、增加了系统的抽象性和理解难度。