简单工厂模式

简单工厂模式(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. 客户端与产品解耦:客户端不需要知道具体类名,只需提供产品类型。

小结

  • 简单工厂模式适合创建单一产品族中的有限产品。
  • 它实现简单,但扩展性差,增加新产品需要修改工厂逻辑。
  • 在实际使用中,通常被视为一种过渡模式,复杂场景中可以使用 工厂方法模式抽象工厂模式 进行改进。
相关推荐
abcnull20 分钟前
用javaparser做精准测试
java·ast·静态代码分析·精准测试·javaparser
叶小鸡26 分钟前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
AI人工智能+电脑小能手42 分钟前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
juniperhan1 小时前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
ID_180079054731 小时前
Python 实现亚马逊商品详情 API 数据准确性校验(极简可用 + JSON 参考)
java·python·json
c++之路1 小时前
C++23概述
java·c++·c++23
时空系1 小时前
第10篇:继承扩展——面向对象编程进阶 python中文编程
开发语言·python·ai编程
专注API从业者2 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
CHANG_THE_WORLD2 小时前
python 批量终止进程exe
开发语言·python
摇滚侠2 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql