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中有哪些地方使用到了简单工厂模式?
优缺点
优点
- 将创建哪种产品的逻辑放在工厂类里面,减去调用方直接创建的麻烦,只要直接使用产品即可
- 调用方无需感知具体创建的对象,只需理解需要创建对象的参数即可。如果将这个参数配置成配置文件,当需要调整创建对象的时候,只需改动配置文件,无需调用方进行修改
缺点
- 所有创建逻辑集中在工厂,造成了单点问题。如果工厂出现问题,所有的创建均不可用
- 系统扩展较麻烦,所有逻辑集中在工厂,如果新增产品类,则会导致工厂类的代码增加,不利于维护
