掌握设计模式之简单工厂模式

简单工厂模式

简单工厂模式 (Simple Factory Pattern)是一种创建型设计模式,它定义了一个工厂类,该类可以根据传入的参数决定创建哪种产品类的实例。简单工厂模式将对象的创建逻辑封装在一个工厂类中,客户端只需要通过工厂类获取实例,而不需要直接涉及实例化的细节。

简单工厂模式包含三个主要部分:

  1. 产品接口(或抽象类):定义产品的共同接口,所有具体产品都实现该接口。

  2. 具体产品:实现产品接口,提供具体的实现。

  3. 工厂类:负责根据客户端的请求创建具体的产品实例。

通过案例理解

案例概述

一个图形工厂,生成出两种画图工具(圆形和矩形),通过生产出来的画图工具进行绘图。

案例结构

使用者(SimpleFactoryDemo)只需要知道,工厂方法类(ShapeFactory)和产品接口(Shape)即可。你写得代码不需要import具体的类进入你的代码,只需要导入接口和工厂类即可,这使得客户端的代码不会和具体的类耦合到一起,这也是面向抽象(接口或抽象类)编程的一大好处,使用的是多态的特性。

案例代码

复制代码
// 产品接口 - 图形
interface Shape {
    void draw();
}

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

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

// 工厂类
class ShapeFactory {
    public static Shape createShape(String type) {
        switch (type) {
            case "circle":
                return new Circle();
            case "rectangle":
                return new Rectangle();
            default:
                throw new IllegalArgumentException("无效的形状类型: " + type);
        }
    }
}

// 客户端代码
public class SimpleFactoryDemo {
    public static void main(String[] args) {
        // 创建圆形
        Shape circle = ShapeFactory.createShape("circle");
        circle.draw();

        // 创建矩形
        Shape rectangle = ShapeFactory.createShape("rectangle");
        rectangle.draw();
    }
}

案例简析

这就好比如我手上只有一支笔,只需要在画图工具界面上选择什么形状就可以画什么形状。

如果某天我想加入五角星形,那需要新增五角星形类和修改工厂类即可。

如果某天我想删除矩形,只需要修改工厂方法即可,甚至都不要删除Rectangle

简单工厂模式的优缺点

优点:
  • 封装了对象的创建过程 :客户端代码只需要调用工厂的createShape()方法,不需要知道具体的产品类的构造过程。

  • 便于扩展:只需要扩展新的产品类,并在工厂中增加相应的创建方法即可。

缺点:
  • 工厂类职责过重:随着产品种类的增多,工厂类会变得非常庞大且难以维护,因为工厂类需要处理所有类型的实例化。

  • 不符合开闭原则:每增加一个新的产品类,都需要修改工厂类,违反了开闭原则。

总结

简单工厂模式是一种通过一个工厂类来创建不同类型对象的模式,客户端不需要关心对象的创建过程,只需要调用工厂方法来获取所需的对象。它适用于对象较少且不会频繁变动的场景。随着产品类型的增加,简单工厂模式可能变得难以维护,因此对于复杂的情况,通常会考虑使用工厂方法模式或抽象工厂模式。

文章转载自: ++渊渟岳++

原文链接: https://www.cnblogs.com/dennyLee2025/p/18587262

体验地址: 引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关推荐
Java陈序员3 分钟前
再见 Navicat!一款开源的 Web 数据库管理工具!
java·react.js·docker
知其然亦知其所以然19 分钟前
RAG 结果太水?用 RRF + Reranker 重排,效果翻倍提升!
java·后端·llm
SimonKing21 分钟前
吊打面试官系列:Spring为什么不推荐使用字段依赖注入?
java·后端·架构
魔镜魔镜_谁是世界上最漂亮的小仙女28 分钟前
java-集合
java·后端·程序员
真实的菜29 分钟前
消息队列高级特性与原理:解锁分布式系统的底层逻辑
java
若水不如远方31 分钟前
java范型
java
凌辰揽月33 分钟前
Web后端基础(基础知识)
java·开发语言·前端·数据库·学习·算法
lifallen39 分钟前
深入浅出 Arrays.sort(DualPivotQuicksort):如何结合快排、归并、堆排序和插入排序
java·开发语言·数据结构·算法·排序算法
长安不见41 分钟前
背景知识: 理解LimitLatch背后的AQS
java
小吕学编程43 分钟前
策略模式实战:Spring中动态选择商品处理策略的实现
java·开发语言·设计模式