工厂方法模式是一种创建型设计模式,它通过定义一个创建对象的接口,但将实际的对象创建延迟到子类中去完成。这样可以使一个类的实例化延迟到其子类。
举例来说, 卡车Truck和 轮船Ship类都必须实现 运输Transport接口, 该接口声明了一个名为 deliver交付的方法。 每个类都将以不同的方式实现该方法: 卡车走陆路交付货物, 轮船走海路交付货物。 陆路运输RoadLogistics类中的工厂方法返回卡车对象, 而 海路运输SeaLogistics类则返回轮船对象。
public interface Transport {
void deliver();
}
public class RoadLogistics implements Logistics {
@Override
public Transport createTransport() {
return new Truck();
}
}
public class SeaLogistics implements Logistics {
@Override
public Transport createTransport() {
return new Ship();
}
}
public interface Transport {
void deliver();
}
public class Ship implements Transport {
@Override
public void deliver() {
System.out.println("轮船通过水路运输");
}
}
public class Truck implements Transport {
@Override
public void deliver() {
System.out.println("卡车通过陆地运输");
}
}
public static void main(String[] args) {
Logistics logistics = new RoadLogistics();
Transport logisticsInstance = logistics.createTransport();
logisticsInstance.deliver();
Logistics seaLogistics = new SeaLogistics();
Transport seaLogisticsInstance = seaLogistics.createTransport();
seaLogisticsInstance.deliver();
}
优点:
- 松耦合:工厂方法模式将具体产品类和工厂类解耦,客户端代码只需要知道使用产品的接口,而无需关心具体产品是如何创建的。
- 可扩展性:当需要新增产品时,只需添加新的具体产品类和对应的工厂类,不需要修改已有代码,符合开闭原则。
- 符合单一职责原则:每个具体工厂类负责创建一种产品,符合类的职责单一性原则。
- 隐藏复杂逻辑:客户端只需要关心所需产品的接口,不需要关心产品的创建过程,隐藏了具体实现细节。
缺点:
- 类的数量增加:每增加一个具体产品类,就需要增加一个对应的具体工厂类,可能会导致类的数量激增。
- 增加了系统复杂度:引入了额外的类和层次结构,可能会增加系统的复杂度和理解难度。
- 不易于理解:相比直接实例化对象,使用工厂方法模式会增加阅读和理解代码的难度,特别是对于刚接触该模式的开发者来说。
工厂方法模式适合于那些创建对象的逻辑比较复杂,或者需要根据特定条件来创建不同对象的场景。在这些情况下,工厂方法模式能够提供灵活性和可扩展性,并帮助管理对象的创建过程。