简单工厂模式

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

小结

  • 简单工厂模式适合创建单一产品族中的有限产品。
  • 它实现简单,但扩展性差,增加新产品需要修改工厂逻辑。
  • 在实际使用中,通常被视为一种过渡模式,复杂场景中可以使用 工厂方法模式抽象工厂模式 进行改进。
相关推荐
九月十九26 分钟前
java使用aspose读取word里的图片
java·word
呆呆的小草1 小时前
Cesium距离测量、角度测量、面积测量
开发语言·前端·javascript
uyeonashi1 小时前
【QT系统相关】QT文件
开发语言·c++·qt·学习
一 乐2 小时前
民宿|基于java的民宿推荐系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·源码
爱记录的小磊2 小时前
java-selenium自动化快速入门
java·selenium·自动化
鹏码纵横2 小时前
已解决:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 异常的正确解决方法,亲测有效!!!
java·python·mysql
weixin_985432112 小时前
Spring Boot 中的 @ConditionalOnBean 注解详解
java·spring boot·后端
Mr Aokey2 小时前
Java UDP套接字编程:高效实时通信的实战应用与核心类解析
java·java-ee
冬天vs不冷2 小时前
Java分层开发必知:PO、BO、DTO、VO、POJO概念详解
java·开发语言