工厂模式分为三种
简单工厂模式
需要三个角色:产品抽象类(接口)、产品具体实现类、工厂类
/** * 产品抽象接口 * Created by lidongyang on 2017/8/23 0023. */public interface Car { void driver();}
/** * 产品具体实现类1:宝马 * Created by lidongyang on 2017/8/23 0023. */public class BMW implements Car { public void driver() { System.out.println("我是宝马"); }}
/** * 产品具体实现类2:奔驰 * Created by lidongyang on 2017/8/23 0023. */public class Benz implements Car { public void driver() { System.out.println("我是奔驰"); }}
/** * 工厂类 * Created by lidongyang on 2017/8/23 0023. */public class Factory { public static Car create(String carType){ if ("bmw".equals(carType)){ return new BMW(); } if("benz".equals(carType)){ return new Benz(); } return null; }}
下面是测试类
/** * Created by lidongyang on 2017/8/22 0022. */public class Test { public static void main(String[] args) { Car car = Factory.create("bmw"); car.driver(); }}
从测试类我们也可以看出,在我们需要一辆车的时候,我们并不需要关心如何去创建这个车,我们只要告诉工厂,我要宝马,那么工厂给我们的就是宝马。
优点:1、不需要关心对象的具体创建 2、符合开闭原则(对扩展开放,对修改关闭),但是这里貌似不全对,当我们如果需要一个马自达时,再加一个马自达的实现类就好了,而不需要改变其他的,这里实现了对扩展开放。但是工厂类的话,我们还是得修改,这违背了对修改关闭这部分原则。为了解决这个问题,我们有下面的一种工厂模式
工厂方法模式
有四个角色:工厂抽象类(接口)、具体工厂类、产品抽象类(接口)、具体产品类
对于产品抽象类和具体产品类,和上面一样,这里不在列代码,下面看工厂类
/** * 工厂接口 * Created by lidongyang on 2017/8/23 0023. */public interface Factory { Car creat();}
/** * 工厂实现类1、宝马工厂 * Created by lidongyang on 2017/8/23 0023. */public class BMWFactory implements Factory{ public Car creat() { return new BMW(); }}
下面是测试类
/** * Created by lidongyang on 2017/8/22 0022. */public class Test { public static void main(String[] args) { Factory factory = new BMWFactory(); Car car = factory.creat(); car.driver(); }}
由此我们看出,当我们需要一辆车时,我们先得有一个对应车品牌的工厂,然后从工厂中拿车,这解决了简单工厂模式中不满足的“对修改关闭”的问题,假如我们再次需要马自达时,只要再加一个马自达的工厂类、马自达的产品类,就OK了。但是我们又遇到一个问题,如果有一天我们需要100种产品,难道我们要建100个工厂类吗?
抽象工厂模式
我的理解抽象工厂模式虽然一定程序上解决了上面的问题,但是它的主要目的不是解决这个问题。
抽象工厂模式,其实就是在上述的基础上,抽象工厂类(接口)中,不仅能生产小轿车,还可以生产大卡车、还可以生产吉普车等等,如下
/** * 工厂接口,生产吉普和小轿车 * Created by lidongyang on 2017/8/23 0023. */public interface Factory { Jeep creatJeep(); Car creatCar();}
/** * 工厂实现类1,生产奔驰的品牌(奔驰厂) * eated by lidongyang on 2017/8/24 0024. */public class BenzFactory implements Factory { public Jeep creatJeep() { return new BenzJeep(); } public Car creatCar() { return new Benz(); }}
/** * 工厂实现类2、宝马工厂 * Created by lidongyang on 2017/8/23 0023. */public class BMWFactory implements Factory{ public Jeep creatJeep() { return new BMWJeep(); } public Car creatCar() { return new BMW(); }}
综上所述,其实三种工厂模式,是层层递进的,总结一下
简单工厂:产品抽象类(接口)、具体产品类、工厂类
工厂模式:产品抽象类(接口)、具体产品类、工厂类、抽象工厂类(接口)
抽象工厂:产品抽象类(接口)、具体产品类、工厂类、抽象工厂类(接口)
其实抽象工厂就是工厂模式的一个进化。工厂模式的工厂只能生产一种产品,而抽象工厂的工厂可以生产多种产品。