工厂方法模式

简单工厂模式

简单工厂模式的核心思想是将对象的创建封装在一个工厂类中,吧创建对象的的流程集中在这个工厂类里面。

简单工厂包括三个主要角色,工厂类、抽象对象、具体对象。

  • 抽象对象描述对象的通用行为,通常使用接口或抽象类实现。
  • 具体对象实现接口或继承抽象类,具体对象通过简单工厂的if-else逻辑来进行实例化。
  • 工厂类负责创建产品,根据传递的不同参数创建不同的产品实例。

是什么

工程方法模式是一种创建型设计模式,简单工厂模式只要一个工厂类,负责创建所有产品,如果添加新的产品,就需要修改工厂类的代码。而工厂方法模式引入了抽象工厂和具体工厂的概念,每个具体工厂负责创建一个具体产品,新添加的产品只需要添加新的工厂类,而不需要修改原来的代码,是的产品的生产更加灵活,支持拓展,符合开闭原则。

工厂方法模式通常有以下几个角色:

  • 抽象工厂:一个接口,包含抽象的工厂方法,用于创建产品对象。
  • 具体工厂:实现抽象工厂接口,创建具体的产品。
  • 抽象产品:定义产品的接口。
  • 具体产品:实现抽象产品接口,是工厂创建的对象。

实际上工厂方法模式也很好理解,就拿“手机Phone”这个产品举例,手机是一个抽象产品,小米手机、华为手机、苹果手机是具体的产品实现,而不同品牌的手机在各自的生产厂家生产。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
interface Phone {
void call();
}

class Huawei implements Phone {
@Override
public void call() {
System.out.println("huawei call...");
}
}

class Xiaomi implements Phone {
@Override
public void call() {
System.out.println("xiaomi call...");
}
}
// 抽象工厂
interface PhoneFactory {
Phone getPhone();
}
// 具体工厂
class HuaweiFactory implements PhoneFactory {
@Override
public Phone getPhone() {
return new Huawei();
}
}

class XiaomiFactory implements PhoneFactory {
@Override
public Phone getPhone() {
return new Xiaomi();
}
}

应用场景

工厂方法模式使得每个工厂类的职责单一,每个工厂只负责创建一种产品,当创建对象涉及一系列复杂的初始化逻辑,而这些逻辑在不同的子类中可能有所不同时,可以使用工厂方法模式将这些初始化逻辑封装在子类的工厂中。在现有的工具、库中,工厂方法模式也有广泛的应用,比如:

  • Spring 框架中的 Bean 工厂:通过配置文件或注解,Spring 可以根据配置信息动态地创建和管理对象。
  • JDBC 中的 Connection 工厂:在 Java 数据库连接中,DriverManager 使用工厂方法模式来创建数据库连接。不同的数据库驱动(如 MySQL、PostgreSQL 等)都有对应的工厂来创建连接。