简单工厂模式

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

小结

  • 简单工厂模式适合创建单一产品族中的有限产品。
  • 它实现简单,但扩展性差,增加新产品需要修改工厂逻辑。
  • 在实际使用中,通常被视为一种过渡模式,复杂场景中可以使用 工厂方法模式抽象工厂模式 进行改进。
相关推荐
格林威15 分钟前
C#图像像素放大:邻域平均、双线性插值实现像素放大的C#实现代码
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
兔兔兔兔125 分钟前
记录C++ 8
开发语言·c++
paopaokaka_luck39 分钟前
基于springboot3+vue3的文山民族文化资源展示与推广平台(协同过滤算法、Echarts 图形化分析)
java·前端·spring boot·学习·echarts
eralong1 小时前
Java IO 与 NIO
java·后端
Jesse_EC1 小时前
我给消息推送加了 Publisher Confirm,然后亲手引入了一个竞态
java
名字还没想好☜1 小时前
Go 1.23 range-over-func 迭代器实战:自定义可迭代类型、提前退出与惰性求值
开发语言·后端·golang·go·迭代器
S3rein1 小时前
JAVA多线程手撕
java·多线程
用户8181870627461 小时前
第7章 死锁排查实录:jstack定位死锁的完整流程
java·后端
喵同志不止步于码农1 小时前
Java Caffeine 快速入门
java·开发语言·后端·并发·缓存一致性
Java成神之路-1 小时前
Java 并发灵魂拷问:notify/signal 唤醒顺序是规范还是实现?
java