工厂模式
实现创建者与调用者的分离。关注产品,不关注细节。
学习工厂模式之前,我们先来了解一个面向对象设计的基本原则
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();
}
}
调用类