23种设计模式之工厂模式

工厂模式属于创建型设计模式,核心思想:封装对象创建逻辑,统一生产对象,隔离对象创建与使用。

工厂模式分三大类

  1. 简单工厂(静态工厂)

    1 个工厂 + N 个产品,工厂依赖抽象产品

  2. 工厂方法

    N 个工厂 + N 个产品,1 个工厂对应 1 个产品

  3. 抽象工厂

    N 个工厂 + 多组产品(产品族),1 个工厂对应一整套产品


一、简单工厂模式(Simple Factory)

1. 定义

一个工厂类 负责创建所有产品实例,根据传入参数决定创建哪一个对象。不属于 GoF 23 种标准设计模式

2. 角色

  • 抽象产品:产品统一接口/父类

  • 具体产品:接口实现类

  • 工厂类:核心,包含创建对象逻辑

3. 适用场景

产品种类少、创建逻辑简单,客户端只需传入标识就能获取对象。

4. 代码和UMl类图

复制代码
// 1. 抽象产品
public interface Fruit {
    void eat();
}

// 2. 具体产品
class Apple implements Fruit {
    @Override
    public void eat() {
        System.out.println("吃苹果");
    }
}
class Banana implements Fruit {
    @Override
    public void eat() {
        System.out.println("吃香蕉");
    }
}

// 3. 工厂类
class FruitFactory {
    // 静态方法:简单工厂核心
    public static Fruit createFruit(String type) {
        if ("apple".equals(type)) {
            return new Apple();
        } else if ("banana".equals(type)) {
            return new Banana();
        }
        return null;
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Fruit apple = FruitFactory.createFruit("apple");
        apple.eat();
    }
}

5. 优缺点

  • 优点:创建逻辑集中,客户端不用 new 对象

  • 缺点:违背开闭原则,新增产品必须修改工厂代码;产品多时代码臃肿


二、工厂方法模式(Factory Method)⭐ 标准23种模式之一

1. 定义

一个产品对应一个工厂 ,定义抽象工厂接口,让具体工厂创建对应具体产品。

完全遵循开闭原则:新增产品只需要新增对应工厂,不修改原有代码。

2. 角色

  • 抽象产品

  • 具体产品

  • 抽象工厂:定义创建产品的抽象方法

  • 具体工厂:实现抽象工厂,生产对应产品

3. 适用场景

产品种类较多,且频繁新增产品,需要严格遵守开闭原则。

4. 代码和uml类型图

复制代码
// 1. 抽象产品
public interface Fruit {
    void eat();
}
// 具体产品
class Apple implements Fruit {
    @Override
    public void eat() { System.out.println("吃苹果"); }
}
class Banana implements Fruit {
    @Override
    public void eat() { System.out.println("吃香蕉"); }
}

// 2. 抽象工厂
public interface FruitFactory {
    Fruit createFruit();
}

// 3. 具体工厂
class AppleFactory implements FruitFactory {
    @Override
    public Fruit createFruit() {
        return new Apple();
    }
}
class BananaFactory implements FruitFactory {
    @Override
    public Fruit createFruit() {
        return new Banana();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        FruitFactory factory = new AppleFactory();
        Fruit fruit = factory.createFruit();
        fruit.eat();
    }
}

5. 优缺点

  • 优点:遵守开闭原则;单一职责,一个工厂只生产一种产品

  • 缺点:类数量爆炸,每加一个产品就要加一个工厂类


三、抽象工厂模式(Abstract Factory)⭐ 标准23种模式之一

1. 定义

工厂生产「产品族」,而非单个产品。

  • 产品族:一组相关/配套的产品(如:手机 + 耳机 一套数码产品)

  • 产品等级:同类型不同品牌(如:小米手机、华为手机)

2. 核心区别(对比工厂方法)

  • 工厂方法:一个工厂只生产一类产品(单一产品)

  • 抽象工厂:一个工厂生产一整套产品(产品族)

3. 角色

  • 抽象产品(多个:产品A、产品B)

  • 具体产品

  • 抽象工厂:定义多个创建方法,对应不同产品

  • 具体工厂:实现整套产品的创建

4. 适用场景

系统存在多组配套产品,产品之间有约束、必须搭配使用。

5. 代码(Java)和uml类图

场景:数码产品族(手机、耳机),两个品牌:小米、华为

复制代码
// ===== 抽象产品 =====
// 手机抽象
public interface Phone {
    void call();
}
// 耳机抽象
public interface Headset {
    void listen();
}
​
// ===== 具体产品 =====
// 小米产品
class XiaomiPhone implements Phone {
    @Override
    public void call() { System.out.println("小米手机通话"); }
}
class XiaomiHeadset implements Headset {
    @Override
    public void listen() { System.out.println("小米耳机听歌"); }
}
// 华为产品
class HuaweiPhone implements Phone {
    @Override
    public void call() { System.out.println("华为手机通话"); }
}
class HuaweiHeadset implements Headset {
    @Override
    public void listen() { System.out.println("华为耳机听歌"); }
}
​
// ===== 抽象工厂(生产整套产品) =====
public interface DigitalFactory {
    Phone createPhone();
    Headset createHeadset();
}
​
// ===== 具体工厂(品牌工厂,生产整个产品族) =====
class XiaomiFactory implements DigitalFactory {
    @Override
    public Phone createPhone() { return new XiaomiPhone(); }
    @Override
    public Headset createHeadset() { return new XiaomiHeadset(); }
}
class HuaweiFactory implements DigitalFactory {
    @Override
    public Phone createPhone() { return new HuaweiPhone(); }
    @Override
    public Headset createHeadset() { return new HuaweiHeadset(); }
}
​
// 客户端
public class Client {
    public static void main(String[] args) {
        DigitalFactory factory = new XiaomiFactory();
        Phone phone = factory.createPhone();
        Headset headset = factory.createHeadset();
        phone.call();
        headset.listen();
    }
}

6. 优缺点

  • 优点:保证产品族配套使用;新增品牌工厂方便(苹果工厂),符合开闭

  • 缺点:新增产品等级非常麻烦(比如新增「手表」,所有工厂都要改)


四、三种工厂模式对比总结

模式 特点 开闭原则 适用场景
简单工厂 单工厂、多产品,靠参数判断 不满足 产品固定、很少新增
工厂方法 一产品对应一工厂 满足 单一产品类型,频繁加产品
抽象工厂 工厂生产整套产品族 产品族扩展友好,产品等级扩展困难 多组配套产品

五、实际开发使用建议

  1. 简单工厂:日常快速开发、工具类、内部组件最常用

  2. 工厂方法:框架、开源组件、需要持续迭代扩展的模块

  3. 抽象工厂:电商多产品线、软硬件配套、跨平台多组件场景

六、常见面试考点

  1. 工厂模式的作用:解耦对象创建与使用、统一管理实例、屏蔽创建细节

  2. 简单工厂为什么不算标准23种设计模式?破坏开闭原则

  3. 工厂方法 vs 抽象工厂:单一产品 vs 产品族

  4. 开闭原则在三种模式中的体现

相关推荐
geovindu2 小时前
python:Coroutines Pattern
开发语言·python·设计模式·协程模式
sensen_kiss3 小时前
CPT304 SoftwareEngineeringII 软件工程 2 Pt.6 批判性分析 / 关键性分析(Critical Analysis)
学习·软件工程
sensen_kiss3 小时前
CPT304 SoftwareEngineeringII 软件工程 2 Pt.7 开源开发 (Open Source Development)
开源·软件工程
sycmancia3 小时前
Qt——模型视图设计模式
设计模式
玖玥拾19 小时前
C/C++ 基础笔记(十一)类的进阶
c语言·c++·设计模式·
小bo波19 小时前
形式化方法 × UML
java·软件工程·uml·面向对象·形式化方法·tla+
lsyeei20 小时前
UML 状态机图
软件工程·uml
geovindu1 天前
go: Broadcast Pattern
开发语言·后端·设计模式·golang·广播模式
我爱cope1 天前
【Agent智能体23 | 规划-规划工作流】
人工智能·设计模式·语言模型·职场和发展