简单工厂模式有一个缺陷,那就是不符合OCP开闭原则,当我们想生产一辆新品种车型时,必须修改简单工厂类源码。而工厂模式由于一种工厂只生产一种产品。当我们需要生产一辆新品种汽车,只需要新建一个新品类的工厂即可,即对增加开放,对修改关闭。符合开闭原则。
在UML图上可以清晰的看出,工厂模式只比简单工厂模式多一个角色:抽象工厂,其可以是抽象类也可以是接口,还是以生产汽车为例举例说明工厂方法设计模式的原理
public class FactoryDemo { interface Car { void run(); void stop(); String brand(); } static class BMW540Li implements Car { @Override public void run() { System.out.println("BMW540Li启动"); } @Override public void stop() { System.out.println("BMW540Li停止"); } @Override public String brand() { return "宝马"; } } static class AudiA7 implements Car { @Override public void run() { System.out.println("AudiA7启动"); } @Override public void stop() { System.out.println("AudiA7停止"); } @Override public String brand() { return "奥迪"; } } interface CarFactroy{ Car factory(); } static class BMWFactory implements CarFactroy{ @Override public Car factory() { return new BMW540Li(); } } static class AudiFactory implements CarFactroy{ @Override public Car factory() { return new AudiA7(); } } public static void main(String[] args) { BMWFactory bmwFactory = new BMWFactory(); Car car1 = bmwFactory.factory(); car1.run(); car1.stop(); System.out.println("我的品牌是:"+car1.brand()); System.out.println("----------------------"); AudiFactory audiFactory = new AudiFactory(); Car car2 = audiFactory.factory(); car2.run(); car2.stop(); System.out.println("我的品牌是:"+car2.brand()); } }
BMW540Li启动
BMW540Li停止
我的品牌是:宝马
----------------------
AudiA7启动
AudiA7停止
我的品牌是:奥迪