工厂方法模式
引言
在静态工厂模式一节中可以发现,如果新增或删减一个产品时,工厂也要对应的作出修改,这极大的增加了出错的可能,那么有什么办法可以避免呢?
正文
工厂方法模式就是我们定义一个生产产品的工厂接口,该接口不直接生产产品,而是将产品的生产分派给具体的工厂类中,从而可以实现产品的生产和使用相分离的目的。
代码实现
一个工业园区有很多的汽车制造厂,比如宝马车厂制造宝马车,奥迪车厂制造奥迪车。
//生产汽车的工厂接口
public interface CarFactory {
Car produceCar();
}
复制代码
//奥迪车厂
public class AudiFactory implements CarFactory {
@Override
public Car produceCar() {
System.out.println("这里是奥迪汽车厂,正在努力造车中。。。");
return new Audi();
}
}
复制代码
//宝马车厂
public class BMWFactory implements CarFactory {
@Override
public Car produceCar() {
System.out.println("这里是宝马汽车厂,正在努力造车中。。。");
return new BMW();
}
}
复制代码
//汽车接口
public interface Car {
void produceCar();
}
复制代码
//奥迪车
public class Audi implements Car {
@Override
public void produceCar() {
System.out.println("造出来一辆奥迪A3~");
}
}
复制代码
//宝马车
public class BMW implements Car {
@Override
public void produceCar() {
System.out.println("造出来一辆宝马5~");
}
}
复制代码
// 在这里我想生产宝马或奥迪
public class Main {
public static void main(String[] args) {
BMWFactory bmwFactory = new BMWFactory();
BMW bmw = (BMW) bmwFactory.produceCar();
bmw.produceCar();
System.out.println();
AudiFactory audiFactory = new AudiFactory();
Audi audi = (Audi) audiFactory.produceCar();
audi.produceCar();
}
}
复制代码
输出结果
这里是宝马汽车厂,正在努力造车中。。。
造出来一辆宝马5~
这里是奥迪汽车厂,正在努力造车中。。。
造出来一辆奥迪A3~
复制代码
总结
相比简单工厂模式,工厂方法模式做到了解耦,既没有违背开闭原则,又保持了封装对象创建过程的优点。其缺点是每增加一个产品,就要对应增加一个工厂类,增加了额外的开发量。