简单工厂模式

简单工厂模式(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++源码阅读__smart_ptr__正文阅读
开发语言·c++·开源
沐泽Mu20 分钟前
嵌入式学习-C嘎嘎-Day08
开发语言·c++·算法
Non importa21 分钟前
汉诺塔(hanio)--C语言函数递归
c语言·开发语言·算法·学习方法
LinuxST22 分钟前
27、基于Firefly-rk3399中断休眠唤醒实验(按键中断)
linux·开发语言·stm32·嵌入式硬件
Tony_long748325 分钟前
Python学习——猜拳小游戏
开发语言·python·学习
跳动的梦想家h28 分钟前
黑马点评 秒杀下单出现的问题:服务器异常---java.lang.NullPointerException: null(已解决)
java·开发语言·redis
苹果醋330 分钟前
前端面试之九阴真经
java·运维·spring boot·mysql·nginx
ac-er88881 小时前
PHP 二分法查找算法
开发语言·算法·php
哎呦没1 小时前
Spring Boot OA:企业办公自动化的高效路径
java·spring boot·后端
真心喜欢你吖1 小时前
Spring Boot与MyBatis-Plus的高效集成
java·spring boot·后端·spring·mybatis