定义

定义一个创建对象的接口,但实现让这个接口的类来决定具体实例化哪个类,工厂方法让类的实例化推迟到子类中进行

类型:创建型

使用场景

(1)创建对象需要大量重复的代码
(2)客户端不依赖于产品类实例如何创建、实现等细节
(3)一个类通过其子类来指定创建哪个对象

优缺点

优点:
用户只需要关心所需产品对应的工厂,无需关心创建细节
加入新产品符合开闭原则,提高可扩展性
缺点:
类的个数容易过多,增加复杂度
增加了系统的抽象性和理解难度

Demo

这里结合简单工厂模式​继续改造一下
将FruitFactory修改为抽象类,具体水果类的创建延迟到它的子类中

public abstract class FruitFactory {

public abstract Fruit getFruit();
}

添加新的工厂类,实现子类

public class AppleFactory extends FruitFactory {
@Override
public Fruit getFruit() {
return new Apple();
}
}
public class BananaFactory extends FruitFactory {
@Override
public Fruit getFruit() {
return new Banana();
}
}

最后测试类

public class Test {
public static void main(String[] args) {
FruitFactory appleFactory = new AppleFactory();
Fruit fruit = appleFactory.getFruit();
fruit.name();
}
}

工厂方法解决的是产品族的问题,上面不同的水果Apple Banana都属于同一个产品等级——水果,而某种水果的名字 价格属于同一产品族,这便是工厂方法要解决的。