设计模式:工厂模式

设计模式:工厂模式

1. 什么是工厂模式?

工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定实例化哪个类。换句话说,工厂模式将对象的创建过程封装起来,使得客户端不需要知道具体的创建细节,而是通过工厂接口来获取对象实例。

image-20240903203647925

工厂模式的主要有三种变体:

  • 简单工厂模式(Simple Factory Pattern):不属于GoF的23种设计模式之一,但常被提及。它是通过一个工厂类来创建对象,通常会有一个静态方法根据参数来返回不同的对象实例。

    • 简单来说就是一个窗口打菜,想吃什么得告诉窗口的阿姨让他帮你找
  • 工厂方法模式(Factory Method Pattern):定义一个创建对象的接口,让子类决定实例化哪个类。工厂方法使得一个类的实例化延迟到其子类。

    • 可以理解为同时有多个窗口卖吃的,但是每个窗口只卖一种
  • 抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建相关或依赖对象的家族,而无需明确指定具体类。

image-20240903192737707

2. 如何使用工厂模式?

2.1 工厂方法

假设我们有一个产品接口Product,以及两个具体的产品实现类ConcreteProductAConcreteProductB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 产品接口
public interface Product {
void use();
}

// 具体产品A
public class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("Using Product A");
}
}

// 具体产品B
public class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("Using Product B");
}
}

然后,我们定义一个工厂接口Factory,以及两个具体的工厂实现类ConcreteFactoryAConcreteFactoryB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 工厂接口
public interface Factory {
Product createProduct();
}

// 具体工厂A
public class ConcreteFactoryA implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}

// 具体工厂B
public class ConcreteFactoryB implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}

客户端代码可以通过工厂来创建具体的产品实例,而无需知道具体产品类的细节。

1
2
3
4
5
6
7
8
9
10
11
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.use(); // 输出 "Using Product A"

Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.use(); // 输出 "Using Product B"
}
}

2.2 抽象工厂

抽象工厂又可以被理解为是工厂的工厂

假设华为和小米分别有两个工厂,同时他们都生产手机和路由器,那么就可以抽象为同一类的工厂

image-20240903202657245

我们可以看到抽象工厂模式的基本结构包括以下几个部分:

  • 抽象工厂接口(IProductFactory):定义了创建一系列相关对象的方法(如phoneProduct()routerProduct()),它不负责实现具体的实例化过程。
  • 具体工厂类(HuaweiFactory、XiaomiFactory):实现抽象工厂接口,负责具体产品(如华为手机、华为路由器或小米手机、小米路由器)的实例化。
  • 抽象产品接口(IPhoneProduct、IRouterProduct):为不同产品类型定义接口(如手机和路由器),这些接口规定了产品应该具备的功能(如start()shutdown()等)。
  • 具体产品类(HuaweiPhone、XiaomiPhone、HuaweiRouter、XiaomiRouter):实现抽象产品接口,具体定义了产品的行为和属性。

通过工厂类来创建对象,客户端代码就可以依赖于抽象工厂和产品接口,而不需要关心具体的实现细节。例如,使用HuaweiFactory可以创建HuaweiPhoneHuaweiRouter,而使用XiaomiFactory可以创建XiaomiPhoneXiaomiRouter