工厂方法模式(Factory Pattern)是创建型设计模式之一。当需要生成复杂对象时,就可以使用工厂方法模式,一般是定义一个用于创建对象的接口,让子类决定实例化哪个类。此模式核心是封装类中不变的部分,提取个性化经常变的部分为其子类,通过依赖注入达到解耦、复用和后期维护拓展。
其中包含四部分:抽象工厂类,具体工厂类,抽象产品类,具体产品类。
抽象工厂类:如图中的 Factory,是工厂方法模式的核心。
具体工厂类:如图中的 FactoryA、FactoryB,用来实现具体的生产逻辑。
抽象产品类:如图中的 Product,是工厂方法模式所创建的产品的父类
具体产品类:如图中的 ProductA、ProductB,实现抽象产品的某个具体产品的对象
下面我们以一个具体的例子来讲解一下简单实现工厂方法模式的步骤,比如有一家凤凰牌自行车组装商,有 A、B两款自行车,一个工厂里面有两条生产线来组装两种车:
- 创建抽象工具类 BuildBike.java,定义公共接口 build():
public abstract class BuildBike {
public abstract Bike build();
}
- 创建抽象产品类 Bike.java,定义公共接口类 ride():
public abstract class Bike {
public abstract void ride();
}
- 创建具体产品类 BikeA.java,BikeB.java,继承自抽象产品类 Bike.java:
//具体产品类 BikeA
public class BikeA extends Bike {
@Override
public void ride() {
System.out.println("A 自行车可以骑");
}
}
//具体产品类 BikeB
public class BikeB extends Bike {
@Override
public void ride() {
System.out.println("B 自行车可以骑");
}
}
- 创建具体工具类 BuildBikeA.java,BuildBikeB.java,继承自抽象工具类 BuildBike.java
//具体工具类 BuildBikeA
public class BuildBikeA extends BuildBike {
@Override
public Bike build() {
return new BikeA();
}
}
//具体工具类 BuildBikeB
public class BuildBikeB extends BuildBike {
@Override
public Bike build() {
return new BikeB();
}
}
接下来我们可以在 main() 方法中来组装两种自行车了:
public class Main {
public static void main(String[] args) {
//组装 A 自行车
BuildBikeA buildBikeA = new BuildBikeA();
buildBikeA.build().ride();
//组装B 自行车
BuildBikeB buildBikeB = new BuildBikeB();
buildBikeB.build().ride();
}
}
结果:
那么工厂方法模式有什么优点呢?当你需要新增一些产品时,你只需要增加具体的产品类和相应的工厂子类,当公共接口很多,又有不同私有方法时,你完全不必新增一个产品就去再写一次所有的公共接口。降低代码的耦合性,方便以后维护和拓展。
- 工厂方法模式试用场景:
第一种是使用者知道对于某个产品应该使用哪个具体工具类,实例化工具类,生产产品。
第二种是使用者只需要某个产品,不知道也不管哪个具体工具类,交给生产方决策(决策过程对于使用者是透明的),根据情况实例化一个具体的工具类交给使用者。