简单工厂模式

简单工厂模式(Simple Factory Pattern)

简单工厂模式是一种 创建型设计模式,它通过一个工厂类来根据参数创建不同类型的对象,客户端不需要知道具体的实现类。


原理

  1. 核心思想:提供一个工厂类,由它决定实例化哪个具体产品类。
  2. 参与角色
    • 工厂类(Factory):包含用于创建产品对象的逻辑。
    • 产品类(Product):所有创建对象的父类或接口。
    • 具体产品类(Concrete Product):工厂类创建的具体对象。
    • 客户端(Client) :通过工厂获取产品,而不直接使用 new 操作符。

优点

  1. 解耦:客户端无需直接依赖具体类,依赖于工厂和抽象产品。
  2. 简单易用:实现简单,适合创建单一类型或少量产品对象。

缺点

  1. 不符合开闭原则:增加新产品时需要修改工厂代码。
  2. 单一职责问题:工厂类承担了过多的职责,可能会导致代码复杂度增加。

示例代码

场景描述

设计一个图形工厂,用于创建不同类型的图形对象(如圆形和矩形)。


1. 定义抽象产品和具体产品
java 复制代码
// 抽象产品:图形
public interface Shape {
    void draw();
}

// 具体产品:圆形
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Circle.");
    }
}

// 具体产品:矩形
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Rectangle.");
    }
}

2. 定义工厂类
java 复制代码
// 工厂类
public class ShapeFactory {
    // 静态方法,根据类型创建产品
    public static Shape createShape(String type) {
        if (type == null) {
            throw new IllegalArgumentException("Type cannot be null");
        }
        switch (type.toLowerCase()) {
            case "circle":
                return new Circle();
            case "rectangle":
                return new Rectangle();
            default:
                throw new IllegalArgumentException("Unknown shape type: " + type);
        }
    }
}

3. 客户端代码
java 复制代码
public class SimpleFactoryExample {
    public static void main(String[] args) {
        // 使用工厂创建产品
        Shape circle = ShapeFactory.createShape("circle");
        circle.draw(); // Output: Drawing a Circle.

        Shape rectangle = ShapeFactory.createShape("rectangle");
        rectangle.draw(); // Output: Drawing a Rectangle.

        // 如果传入未知类型,会抛出异常
        try {
            Shape unknown = ShapeFactory.createShape("triangle");
            unknown.draw();
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage()); // Output: Unknown shape type: triangle
        }
    }
}

输出结果

text 复制代码
Drawing a Circle.
Drawing a Rectangle.
Unknown shape type: triangle

UML 类图

复制代码
+----------------+
| ShapeFactory   |
|----------------|
| + createShape()|
+----------------+
         |
         v
+------------------+
|     Shape        |
|------------------|
| + draw()         |
+------------------+
    /         \
+---------+  +-----------+
| Circle  |  | Rectangle |
|---------|  |-----------|
| + draw()|  | + draw()  |
+---------+  +-----------+

适用场景

  1. 对象创建逻辑复杂:将创建逻辑集中到工厂中,简化客户端代码。
  2. 类型有限的产品:适合创建数量较少的对象类型。
  3. 客户端与产品解耦:客户端不需要知道具体类名,只需提供产品类型。

小结

  • 简单工厂模式适合创建单一产品族中的有限产品。
  • 它实现简单,但扩展性差,增加新产品需要修改工厂逻辑。
  • 在实际使用中,通常被视为一种过渡模式,复杂场景中可以使用 工厂方法模式抽象工厂模式 进行改进。
相关推荐
MATLAB代码顾问3 小时前
5大智能算法优化标准测试函数对比(Python实现)
开发语言·python
wuminyu4 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
万粉变现经纪人5 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒5 小时前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼5 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
callJJ6 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
小郑加油6 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦6 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
KuaCpp6 小时前
C++面向对象(速过复习版)
开发语言·c++
wbs_scy7 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言