本篇文章总结自 【狂神说Java工厂模式】bilibili 狂神说Java工厂模式
工厂模式核心本质:
- 实例化对象不使用 new,用工厂方法代替
- 将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦
简单工厂模式
例如工厂要生产不同品牌的汽车,有了工厂,消费者不需要手动去 new 一个汽车,只需要借助工厂返回对应的车即可,以下是简单工厂模式结构:
红旗与特斯拉都实现了 Car 接口,表示两中汽车,CarFactory 具有返回两种汽车的方法,消费者只需调用工厂中方法即可:
public class CarFactory {
static Car getHongQi() {
return new HongQi();
}
static Car getTesla() {
return new Tesla();
}
}
public class Consumer {
public static void main(String[] args) {
Car hq = CarFactory.getHongQi();
hq.printCar();
Car tesla = CarFactory.getTesla();
tesla.printCar();
}
}
案例非常简单,适用应用场景为:只有有限的产品(汽车),并且产品内部比较复杂,产品内部不需做任何修改或修改不频繁,如果未来有很多新的产品需要扩展,新增一个产品后工厂也许新增一个方法,又违背了开闭原则,所以又提出工厂方法模式。
工厂方法模式
工厂方法模式实在原有工厂模式上的扩展,解决当产品需扩展而不得不修改工厂中代码的问题,该模式在工厂类的基础上提取出一个工厂接口,里面具有返回具体产品的抽象方法,该接口的实现类就是返回对应产品的工厂,代码结构:
CarFactory:
public interface CarFactory {
Car getCar();
}
专门生产红旗车的工厂,特斯拉工厂也是一样:
public class HongQiFactory implements CarFactory {
@Override
public Car getCar() {
return new HongQi();
}
}
消费者只需获取工厂并调用其方法即可获取产品:
public class Consumer {
public static void main(String[] args) {
Car hq = new HongQiFactory().getCar();
hq.printCar();
Car tesla = new TeslaFactory().getCar();
tesla.printCar();
}
}
适用的应用场景:未来产品可以进行扩展,扩展一个产品要再写一个该产品的工厂,但至少不需要去修改原有代码,符合开闭原则。如果一个工厂需要生产不同种类的产品的话,比如特斯拉可以生产汽车也可以生产太阳能板,那工厂类中还需新增一个返回太阳能板的方法,又违背开闭原则,所以又产生 抽象工厂模式