工厂模式
实现创建者与调用者的分离。关注产品,不关注细节。
学习工厂模式之前,我们先来了解一个面向对象设计的基本原则
OCP(开闭原则,Open-Closed Principle):一个软件的实体应该对扩展开放,对修改关闭。(也就是说,如果我有一个类实现了一部分功能,现在我想添加一个功能,最好通过一个一个新的类来实现,而不是修改已有的类)
工厂模式的核心本质
-实例化对象:用工厂方法代替new操作。
-将选择实现类,创建对象,统一管理和控制。从而将调用者跟我们的实现类解耦。
工厂模式的三种实现方式
1、简单工厂模式:也叫静态工厂模式,用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改已有代码)
车接口
public interface Car { public void run(); }
实现车接口的两个产品
public class Audi implements Car{ @Override public void run() { System.out.println("奥迪在跑"); } } public class BMW implements Car{ @Override public void run() { System.out.println("宝马在跑"); } }
工厂类
public class CarFactory { public static Car createCar(String type) { if (type.equals("Audi")) { return new Audi(); }else if(type.equals("BMW")) { return new BMW(); }else { return null; } } }
调用类
这样我们不难看出,调用者想要得到某一种车,不需要和该车的实体类打交道,只需要告诉工厂类,我需要哪一辆车,工厂类负责生产出来,我们不需要去关心这个实例是怎么创建的。
但是,这里有一个问题,就是我上文提到的,简单工厂模式不完全满足OCP原则,如果我要新增一个产品,比如奔驰车,那么我的工厂类代码就要进行修改。不修改,是没有办法新增产品的。所以为了完全满足OCP原则,我们引入第二种工厂模式。
2、工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
车接口以及其实现类都与简单工厂模式一样,工厂方法模式与简单工厂模式最大的不同就是,简单工厂模式只有一个工厂类(对于一个项目或者一个独立的模块而言),而工厂方法模式拥有一组实现了相同接口的工厂类。
工厂接口
public interface CarFactory { public Car createCar(); }
工厂接口的实现类,不同的工厂生产其对应的产品
public class AudiFactory implements CarFactory{ @Override public Car createCar() { return new Audi(); } } public class BMWFactory implements CarFactory{ @Override public Car createCar() { return new BMW(); } }
调用类
通过工厂方法模式,我们能做到,假如要新增一个奔驰产品,我只需要新建奔驰类实现Car,新建奔驰工厂实现CarFactory就可以实现,这就满足了OCP原则,我们并没有对原有代码进行修改便实现了。
不过我们在实际开发中,使用较多的依旧是简单工厂模式。因为工厂方法模式有多个工厂类,这就导致了工厂方法模式比简单工厂模式的结构更加复杂。在一个,新增产品上,虽然简单工厂模式不完全满足OCP原则,但是它也只需要修改工厂类的代码,相对简单。
并且,我们有一个更加简单的方式来解决简单工厂模式不完全满足OCP原则的缺陷。那就是利用Java反射机制,来实现的简单工厂模式。
实现类
public class CarFactory2 { public static Object createCar(String className) throws Exception { Class<?> clazz = Class.forName(className); Object object = clazz.newInstance(); return object; } }
调用类
这样,新增产品就不需要再去修改工厂类,只需要在调用类中传递类的路径便可。
3、抽象工厂模式:用于生产不同产品族的全部产品(对于增加新产品,无能为力,支持增加产品族)
抽象工厂模式是工厂方法模式得升级,在有多个业务品种,业务分类时,使用该方法
车有引擎,座椅,轮胎
public interface Engine { void run(); void start(); } //实现类,高级引擎和低端引擎 class LuxuryEngine implements Engine { @Override public void run() { System.out.println("转的快"); } @Override public void start() { System.out.println("启动快"); } } class LowEngine implements Engine { @Override public void run() { System.out.println("转的慢"); } @Override public void start() { System.out.println("启动慢"); } }
工厂接口
public interface CarFactory { Engine createEngine(); Seat createSeat(); Tyre createTyre(); }生产高级和低端的工厂实现类
//高端 public class LowCarFactory implements CarFactory{ @Override public Engine createEngine() { return new LowEngine(); } @Override public Seat createSeat() { return new LowSeat(); } @Override public Tyre createTyre() { return new LowTyre(); } } //低端 public class LuxuryCarFactory implements CarFactory{ @Override public Engine createEngine() { return new LuxuryEngine(); } @Override public Seat createSeat() { return new LuxurySeat(); } @Override public Tyre createTyre() { return new LuxuryTyre(); } }
调用类