设计模式之工厂模式(factory pattern):在商品对象创建系统中的应用

news2025/4/22 2:03:34

目录

一、设计思路

1. 简单工厂模式

2. 工厂方法模式

3. 抽象工厂模式

二、UML类图(PlantUML格式)

1.简单工厂模式

2.工厂方法模式

3.抽象工厂模式

三、实现过程与结果

1. 简单工厂模式

2. 工厂方法模式

3. 抽象工厂模式

四、总结

        在面向对象设计中,工厂模式是一种常用的创建型设计模式,它通过将对象的创建逻辑集中管理,使得客户端无需直接创建对象,而是通过工厂类来获取所需的对象实例。这种设计思想不仅提高了代码的可扩展性和可维护性,还增强了系统的灵活性。本文将通过一个鼠标和键盘的商品对象创建系统,详细探讨简单工厂模式、工厂方法模式和抽象工厂模式的应用。

一、设计思路

1. 简单工厂模式

简单工厂模式通过一个统一的工厂类来创建对象,客户端通过传递类型参数来指定需要创建的对象。这种模式适合产品种类较少且不会频繁变化的场景。

  • 鼠标接口:定义鼠标的基本行为。

  • 具体鼠标类:实现无线鼠标和有线鼠标类,分别实现鼠标接口。

  • 鼠标工厂类:根据传入的类型参数创建相应的鼠标对象。

2. 工厂方法模式

工厂方法模式通过定义一个抽象工厂接口,让具体的工厂类实现该接口来创建对象。客户端通过使用抽象工厂接口,而不直接调用具体工厂类。这种模式适合产品种类较多且可能频繁变化的场景。

  • 鼠标接口:定义鼠标的基本行为。

  • 具体鼠标类:实现无线鼠标和有线鼠标类。

  • 抽象工厂接口:声明创建鼠标的方法。

  • 具体工厂类:实现抽象工厂接口,分别创建无线鼠标和有线鼠标。

3. 抽象工厂模式

抽象工厂模式通过一个抽象工厂接口来创建多个相关的产品族。具体工厂实现该接口,生产一组相关的产品。这种模式适合需要创建多个相关产品族的场景。

  • 鼠标接口:定义鼠标的基本行为。

  • 键盘接口:定义键盘的基本行为。

  • 具体产品类:实现无线鼠标、有线鼠标、无线键盘和有线键盘类。

  • 抽象工厂接口:声明创建鼠标和键盘的方法。

  • 具体工厂类:实现抽象工厂接口,分别创建无线设备(鼠标和键盘)和有线设备(鼠标和键盘)。

二、UML类图(PlantUML格式)

1.简单工厂模式

@startuml
interface Mouse {
    + make()
}

class WirelessMouse {
    + make()
}

class WiredMouse {
    + make()
}

class MouseFactory {
    + createMouse(type: String): Mouse
}

Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
MouseFactory --> Mouse
@enduml

2.工厂方法模式

@startuml
interface Mouse {
    + make()
}

class WirelessMouse {
    + make()
}

class WiredMouse {
    + make()
}

interface MouseFactory {
    + createMouse(): Mouse
}

class WirelessMouseFactory {
    + createMouse(): Mouse
}

class WiredMouseFactory {
    + createMouse(): Mouse
}

Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
MouseFactory <|.. WirelessMouseFactory
MouseFactory <|.. WiredMouseFactory
@enduml

3.抽象工厂模式

@startuml
interface Mouse {
    + make()
}

interface Keyboard {
    + make()
}

class WirelessMouse {
    + make()
}

class WiredMouse {
    + make()
}

class WirelessKeyboard {
    + make()
}

class WiredKeyboard {
    + make()
}

interface DeviceFactory {
    + createMouse(): Mouse
    + createKeyboard(): Keyboard
}

class WirelessDeviceFactory {
    + createMouse(): Mouse
    + createKeyboard(): Keyboard
}

class WiredDeviceFactory {
    + createMouse(): Mouse
    + createKeyboard(): Keyboard
}

Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
Keyboard <|.. WirelessKeyboard
Keyboard <|.. WiredKeyboard
DeviceFactory <|.. WirelessDeviceFactory
DeviceFactory <|.. WiredDeviceFactory
@enduml

三、实现过程与结果

1. 简单工厂模式

代码实现:

public interface Mouse {
    void make();
}

public class WirelessMouse implements Mouse {
    @Override
    public void make() {
        System.out.println("制造无线鼠标");
    }
}

public class WiredMouse implements Mouse {
    @Override
    public void make() {
        System.out.println("制造有线鼠标");
    }
}

public class MouseFactory {
    public Mouse createMouse(String type) {
        if ("wireless".equalsIgnoreCase(type)) {
            return new WirelessMouse();
        } else if ("wired".equalsIgnoreCase(type)) {
            return new WiredMouse();
        } else {
            return null;
        }
    }
}

public class Demo {
    public static void main(String[] args) {
        MouseFactory factory = new MouseFactory();
        Mouse wirelessMouse = factory.createMouse("wireless");
        Mouse wiredMouse = factory.createMouse("wired");
        
        wirelessMouse.make(); // 输出:制造无线鼠标
        wiredMouse.make();    // 输出:制造有线鼠标
    }
}

2. 工厂方法模式

代码实现:

public interface Mouse {
    void make();
}

public class WirelessMouse implements Mouse {
    @Override
    public void make() {
        System.out.println("制造无线鼠标");
    }
}

public class WiredMouse implements Mouse {
    @Override
    public void make() {
        System.out.println("制造有线鼠标");
    }
}

public interface MouseFactory {
    Mouse createMouse();
}

public class WirelessMouseFactory implements MouseFactory {
    @Override
    public Mouse createMouse() {
        return new WirelessMouse();
    }
}

public class WiredMouseFactory implements MouseFactory {
    @Override
    public Mouse createMouse() {
        return new WiredMouse();
    }
}

public class Demo {
    public static void main(String[] args) {
        MouseFactory wirelessFactory = new WirelessMouseFactory();
        MouseFactory wiredFactory = new WiredMouseFactory();
        
        Mouse wirelessMouse = wirelessFactory.createMouse();
        Mouse wiredMouse = wiredFactory.createMouse();
        
        wirelessMouse.make(); // 输出:制造无线鼠标
        wiredMouse.make();    // 输出:制造有线鼠标
    }
}

3. 抽象工厂模式

代码实现:

public interface Mouse {
    void make();
}

public interface Keyboard {
    void make();
}

public class WirelessMouse implements Mouse {
    @Override
    public void make() {
        System.out.println("制造无线鼠标");
    }
}

public class WiredMouse implements Mouse {
    @Override
    public void make() {
        System.out.println("制造有线鼠标");
    }
}

public class WirelessKeyboard implements Keyboard {
    @Override
    public void make() {
        System.out.println("制造无线键盘");
    }
}

public class WiredKeyboard implements Keyboard {
    @Override
    public void make() {
        System.out.println("制造有线键盘");
    }
}

public interface DeviceFactory {
    Mouse createMouse();
    Keyboard createKeyboard();
}

public class WirelessDeviceFactory implements DeviceFactory {
    @Override
    public Mouse createMouse() {
        return new WirelessMouse();
    }

    @Override
    public Keyboard createKeyboard() {
        return new WirelessKeyboard();
    }
}

public class WiredDeviceFactory implements DeviceFactory {
    @Override
    public Mouse createMouse() {
        return new WiredMouse();
    }

    @Override
    public Keyboard createKeyboard() {
        return new WiredKeyboard();
    }
}

public class Demo {
    public static void main(String[] args) {
        DeviceFactory wirelessFactory = new WirelessDeviceFactory();
        DeviceFactory wiredFactory = new WiredDeviceFactory();
        
        Mouse wirelessMouse = wirelessFactory.createMouse();
        Keyboard wirelessKeyboard = wirelessFactory.createKeyboard();
        
        Mouse wiredMouse = wiredFactory.createMouse();
        Keyboard wiredKeyboard = wiredFactory.createKeyboard();
        
        wirelessMouse.make(); // 输出:制造无线鼠标
        wirelessKeyboard.make(); // 输出:制造无线键盘
        wiredMouse.make();    // 输出:制造有线鼠标
        wiredKeyboard.make();  // 输出:制造有线键盘
    }
}

四、总结

工厂模式的三种主要形式及其适用场景。每种模式都有其独特的优点和适用范围,合理选择和应用这些模式可以显著提升软件设计的质量和效率。

  1. 简单工厂模式:简单工厂模式以其简洁性和易于理解的特点,非常适合产品种类较少且相对稳定的场景。它通过一个统一的工厂类集中管理对象的创建逻辑,使得客户端代码更加简洁。然而,随着产品种类的增加,简单工厂类的条件判断逻辑可能会变得复杂,这可能会降低代码的可维护性。

  2. 工厂方法模式:工厂方法模式通过将对象的创建逻辑分散到多个具体的工厂类中,有效地解决了简单工厂模式在面对产品种类频繁变化时的扩展性问题。每个具体工厂类负责创建一种具体的产品,这使得系统在添加新产品时更加灵活,只需新增相应的工厂类而无需修改现有代码。这种模式特别适合产品种类较多且可能频繁变化的场景,它不仅提高了代码的可扩展性,还符合开闭原则,即对扩展开放,对修改关闭。

  3. 抽象工厂模式:抽象工厂模式在处理多个相关产品族的创建时表现出色。它通过一个抽象工厂接口定义了一组创建相关产品的方法,具体工厂实现这些方法来生产特定产品族中的产品。这种模式使得系统能够在不依赖具体产品实现的情况下,灵活地切换不同的产品族。这对于需要支持多种产品组合的系统来说是一个巨大的优势,它不仅提高了代码的可维护性,还增强了系统的灵活性和可扩展性。

        在实际的软件开发中,选择合适的工厂模式需要综合考虑系统的复杂性、产品的种类和变化频率以及系统的扩展需求。简单工厂模式适合小型项目或产品种类较少的场景;工厂方法模式适用于产品种类较多且可能频繁变化的系统;而抽象工厂模式则更适合需要创建多个相关产品族的复杂系统。

        此外,工厂模式的应用还体现了面向对象设计的核心原则,如封装、多态和依赖倒置等。通过将对象的创建逻辑封装在工厂类中,客户端代码可以依赖于抽象而非具体实现,这使得系统更加灵活,能够更好地应对需求的变化。

        总之,工厂模式作为一种经典的创建型设计模式,为对象的创建提供了一种优雅的解决方案。它不仅能够提高代码的可读性和可维护性,还能够增强系统的扩展性和灵活性。在未来的软件设计中,合理运用工厂模式将有助于我们构建出更加健壮、灵活和易于维护的软件系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2339787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式exfat-nofuse文件系统移植和使用

exfat-nofuse 是一款专为linux ARM平台设计的开源项目,它提供了一个非FUSE机制的内核级驱动,用于在Linux系统上无缝地读写exFAT和VFAT文件系统。此项目由Dorimanx维护,采用C语言编写&#xff0c;兼容GPL-2.0许可证。它避开了FUSE&#xff08;用户空间文件系统&#xff09;的使用…

再来一篇,Linux中的软件管理

Linux中软件包的类型 在Linux系统中&#xff0c;软件包有多种不同的格式和类型&#xff0c;主要包括以下几种&#xff1a; DEB (Debian软件包)&#xff08;此软件包不适用于RHEL8 系统&#xff09;&#xff1a; 适用于 Debian 及其衍生版本&#xff08;如Ubuntu等&…

SimBody安装

SimBody安装 Simbody 是一个用于创建生物力学和机械系统仿真的多体动力学库。 SimBody安装 Windows安装&#xff1a; 下载地址&#xff1a;GitHub - simbody/simbody: High-performance C multibody dynamics/physics library for simulating articulated biomechanical and…

thinkphp:部署完整项目到本地phpstudy

一、准备工作 首先准备一个thinkphp的项目文件&#xff1b;准备mysql数据库 二、小皮初步搭建 1、建立网站 在小皮界面&#xff0c;网站->创建网站->输入域名&#xff0c;选择PHP版本等 注&#xff1a;确保端口未被占用 2、将项目文件放入根目录 网站->管理->…

大模型相关面试问题原理及举例

大模型相关面试问题原理及举例 目录 大模型相关面试问题原理及举例Transformer相关面试问题原理及举例大模型模型结构相关面试问题原理及举例注意力机制相关面试问题原理及举例大模型与传统模型区别 原理:大模型靠海量参数和复杂结构,能学习更复杂模式。传统模型参数少、结构…

Redis List 的详细介绍

Redis List 的详细介绍 以下是 Redis List 的详细介绍&#xff0c;从基础命令、内部编码和使用场景三个维度展开&#xff1a; 一、基础命令 Redis List 支持双向操作&#xff08;头尾插入/删除&#xff09;&#xff0c;适用于队列、栈等场景&#xff0c;以下是核心命令分类&a…

使用virtualbox的HostOnly建立共享网络-实现虚拟机上网

目录 环境描述解决方案具体步骤1.新建一个virtual host-only ethernet adapter2.设置windows的wifi信号网络共享3.确认winows宿主网络信息3.1.wifi适配器的信息3.2.虚拟网卡的信息3.3.确认virtualbox中虚拟网卡的ip地址 4.虚拟机网卡设置5.虚拟机网络设置5.1.本地连接设置5.2.u…

springboot+vue3+mysql+websocket实现的即时通讯软件

项目演示 即时通讯软件项目演示 业务架构 技术栈 后端 选用编程语言 Javaweb框架SpringBootdb MySQL 持久存储nosql 缓存 Redis全双工通信框架 WebSocket 前端 前端框架Vue3TypescriptUI样式 Css、ElementPlus网页路由 vue-router全双工通信框架Websocket 功能完成情况 已实…

基于 Spring Boot 瑞吉外卖系统开发(五)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;五&#xff09; 删除分类 分类列表中每条分类信息右侧提供了一个“删除”按钮&#xff0c;当需要将已经存在的分类信息删除时&#xff0c;可以通过单击“删除”按钮实现。 请求路径为/category&#xff0c;携带参数id&#xf…

【Web部署问题】在Tomcat中部署web项目出现http状态-404 -未找到详细解决方案

部署完tomcat记得在选中要运行的工件。 如果没有工件&#xff0c;或者工件有缺失东西&#xff0c;去这里配置工件&#xff0c;

Linux——Shell编程之正则表达式与文本处理器(笔记)

目录 基础正则表达式 1:基础正则表达式示例 &#xff08;4&#xff09;查找任意一个字符“.”与重新字符“*” &#xff08;5&#xff09;查找连续字符范围“{ }” 文本处理器 一、sed工具 二、awk工具 &#xff08;1&#xff09;按行输出文本 &#xff08;2&#xff0…

05-DevOps-Jenkins自动拉取构建代码

新建Gitlab仓库 先在Gitab上创建一个代码仓库&#xff0c;选择创建空白项目 安装说明进行填写&#xff0c;然后点击创建项目 创建好的仓库是空的&#xff0c;什么都没有 新建一个springboot项目&#xff0c;用于代码上传使用。 只是为了测试代码上传功能&#xff0c;所以代码…

SRS transcode支持 h264_nvenc 硬件解码方案

文章目录 SRS transcode支持 h264_nvenc 硬件解码方案1、修改文件2、重新编译3、使用 SRS transcode支持 h264_nvenc 硬件解码方案 SRS 是开源的流媒体服务&#xff0c;但在使用 GPU 服务器时&#xff0c;想要通过硬件加速&#xff0c;目前官方是不支持的&#xff0c;所以简单…

阿里云服务器搭建开源版禅道

一&#xff0c;下载地址&#xff1a;禅道11.5版本发布&#xff0c;主要完善细节&#xff0c;修复bug&#xff0c;新增动态过滤机制 - 禅道下载 - 禅道项目管理软件 下载地址二&#xff1a; 禅道21.6.stable 实现旧编辑器撰写的文档无感升级至新版编辑器 - 禅道下载 - 禅道项目…

怎么用面向对象和状态机架构,设计一个通用的按键检测功能?

说起按键检测&#xff0c;在座的各位&#xff0c;哪个没被它折磨过&#xff1f; 我刚入门时&#xff0c;为了实现一个简单的按键功能&#xff0c;硬生生写了几十行代码&#xff0c;各种 if...else 嵌套&#xff0c;逻辑绕得我自己都头晕。 更可气的是&#xff0c;辛辛苦苦写完…

Java基础系列-LinkedList源码解析

文章目录 简介LinkedList 插入和删除元素的时间复杂度&#xff1f;LinkedList 为什么不能实现 RandomAccess 接口&#xff1f; LinkedList 源码分析Node 定义初始化获取元素插入元素删除元素遍历链表 简介 LinkedList 是一个基于双向链表实现的集合类&#xff0c;经常被拿来和…

qwen 14B模型配置文件,层名称weight_map. 28GB

qwen 14B模型配置文件,层名称weight_map. 28GB 目录 qwen 14B模型配置文件,层名称weight_map. 28GBmetadata(元数据)weight_map(权重映射)lm_head.weightmodel.layersmlp.{proj_type}.weightpost_attention_layernormself_attn.{proj_type}.{bias_or_weight}model.norm.w…

LVDS系列8:Xilinx 7系可编程输入延迟(一)

在解析LVDS信号时&#xff0c;十分重要的一环就是LVDS输入信号线在经过PCB输入到FPGA中后&#xff0c;本来该严格对齐的信号线会出现时延&#xff0c;所以需要在FPGA内部对其进行延时对齐后再进行解析。 Xilinx 7系器件中用于输入信号延时的组件为IDELAYE2可编程原语&#xff0…

【Oracle专栏】函数中SQL拼接参数 报错处理

Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 最近同事反馈了一个很奇怪的问题,即有一个函数,入参是当前年月,主要作用是通过SQL语句将不合规的数据插入到指定表中,插入数据时带上入参的年月参数。当前问题:单独测试SQL没有问题可以执行成功,…

自然语言处理(NLP)领域大图

以下是一份自然语言处理&#xff08;NLP&#xff09;与大模型领域的领域大图&#xff0c;涵盖技术框架、发展脉络、交叉融合点和应用场景的完整解析&#xff1a; 1. 核心技术体系 基础分析层级 词法分析&#xff1a;分词、词性标注、命名实体识别句法分析&#xff1a;依存句法…