4.3 简单工厂模式
序言
假设现在有一家生产汽车的工厂,可以生产宝马、奔驰和奥迪等多种车型。只需你告诉工厂的制造人,你需要的车型,工厂就可以给你加工对应的车型。此需求相当与给工厂一个输入,可以获得对应的输出对象,此时就可以使用简单工厂模式。
定义
简单工厂模式(也被称为静态工厂方法模式),属于创建型。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
类图
简单工厂包含了:
- 抽象产品(IProduct)
- 具体产品(ConcreteProduct):最终工厂创建出的实例对象(产品)
- 生成产品的工厂(Factory):用于根据不同条件创建不同的实例(产品)
示例代码
第一步:定义抽象产品:ICar
public interface ICar { void introduce(); }
第二步:定义具体产品(此处分别创建了奔驰车、奥迪车和宝马车)
public class AudiCar implements ICar { @Override public void introduce() { System.out.println("我是奥迪"); } } public class BenzCar implements ICar { @Override public void introduce() { System.out.println("我是奔驰"); } } public class BMWCar implements ICar { @Override public void introduce() { System.out.println("我是宝马"); } }
第三步:创建生产汽车的静态工厂(注意build方法是静态的)
public class CarFactory { public static ICar buildCar(String car) { if ("bmw".equalsIgnoreCase(car)) { return new BMWCar(); } else if ("benz".equalsIgnoreCase(car)) { return new BenzCar(); } else if ("audi".equalsIgnoreCase(car)) { return new AudiCar(); } else { return null; } } }
第四步:给工厂传入参数生产汽车
public class Client { public static void main(String[] args) { // 此处可以输入bmw/audi/benz尝试一下 ICar car = CarFactory.buildCar("audi"); if (car != null) { car.introduce(); // 输出“我是奥迪” } } }
考点1:JDK中有哪些地方使用到了简单工厂模式?
优缺点
优点
- 将创建哪种产品的逻辑放在工厂类里面,减去调用方直接创建的麻烦,只要直接使用产品即可
- 调用方无需感知具体创建的对象,只需理解需要创建对象的参数即可。如果将这个参数配置成配置文件,当需要调整创建对象的时候,只需改动配置文件,无需调用方进行修改
缺点
- 所有创建逻辑集中在工厂,造成了单点问题。如果工厂出现问题,所有的创建均不可用
- 系统扩展较麻烦,所有逻辑集中在工厂,如果新增产品类,则会导致工厂类的代码增加,不利于维护